MYSQL 数据类型
MYSQL列数据类型分为3大类,分别是数值型、字符串型、日期/时间类型;每个大类分表包含不同的小类。下面一一记录:
数值型
整形
整形是指的不包含小数的数值,在MYSQL可以分为五种,分别是:tinyint、smallint、meduimint、int、bigint,平时经常用,但是大多数用的是int类型,由于搞不清楚原因,所以今天学习了下进行记录,以后此问题直接来这里查看即可。
tinyint(迷你整形):
tinyint使用一个字节,有符号范围是-128~127(-2^7~2^7-1),无符号范围是0~255(2^8-1),此字段可以用来使用存储状态、年龄等等数据。
smallint(小整形):
smallint使用两个字节,有符号范围是-32768~32767(-2^7~2^7-1),无符号范围-0~65535,可根据实际情况选择此字段。
mediumint(中整形):
使用3个字节,有符号范围是-8388608~8388607(-2^15~2^15-1),无符号位为0~16777215(2^16-1)。
int(标准整形):
使用4个字节,有符号范围是-2147483648~2147483647(-2^31~2^31-1),无符号位为0~429496295(2^32-1)。此字段使用较多,需根据实际情况使用,否则范围不够或浪费磁盘。
bigint(大整形):
使用8个字节,有符号位是-9223372036854775808~9223372036854775807(-2^63~2^63-1),无符号位:0~18446744073709551615(2^64-1),此字段一般使用大表的自增ID。
unsigned:
无符号标识,无符号指的是没有减号的数据,也就是没有负数。
显示长度:
查看表结构会看到如int(3)这样带括号并且里面带有一个数字,括号里面的长度指的是显示长度;显示长度没有特别含义,只是默认的告诉用户可以显示的形式而已。并不会控制数据本身的长度。
显示宽度的意义:在当数据不够宽度的时候,会自动让数据变成对应的显示宽度(也就是括号内数字的长度),通常需要搭配一个前导0来增加宽度,不改变数值大小。当定义字段类型的时候增加zerofill修饰时,实际数据长度小于显示长度,则会使用0填充。目的是保持数据格式一致。被zerofill修饰的话模式为无符号数据(没有负数)。
小数型
小数型:带有小数点或者超出整形范围的数值类型。
在SQL中小数型分为浮点型和定点性。
浮点型:小数点浮动,精度有限,可能丢失精度。
定点性:小数点固定,精度固定,不会丢失精度。
浮点型:
浮点型数据是一种精度型数据:因为超过指定范围后,会丢失精度(四舍五入)。整数部分不可以超出范围也就是下面的M-D长度,超出长度后直接报错。小数部分可以超出长度,超出长度部分会自动四舍五入掉。但是浮点数如果因为系统进位导致整数部分超出指定的长度,那么系统也允许成立。
浮点型:理论分为两种精度
Float:单精度,占用4个字节,精度范围大概为7位左右。直接使用float表示没有小数部分;float(M,D):M代表总长度,D代表小数部分长度,整数部分为M-D,一旦超出M位的话会出现精度丢失。
Double:双精度,占用8个字节,精度范围大概为15为左右。
定点型
定点型:绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分可能丢失(理论上小数部分也不会丢失精度)。
插入数据:定点数的整数部分一定不能超出长度(进位不可以),小数部分的长度可以随意超出(系统自动四舍五入)。
浮点数如果进位导致整数部分长度溢出没有问题,但是定点数不行。数据要求精确一定要使用定点数。如果数据比较错乱或比较大的话就可以使用浮点数。
时间日期类型
Datetime:时间日期,格式是YYYY-mm-dd HH:ii:ss,表示是范围从1000到9999年,有0值:0000-00-00 00:00:00。
Date:日期,是datetime的date部分。
Time:时间(段),指定的某个区间之间,-时间到+时间。
Timestamp:时间戳,其实也不是时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss格式,与Datetime一致。
Year,年份,两种形式,year(2)和year(4):1901-2156
注意time和year
Timestamp字段:只要当前所在的记录被更新,该字段一定会自动更新成当前时间。
字符串类型
在SQL中,将字符串类型分为6类,char、varchar、text、blob、enum和set。
定长字符串
定长字符串:char(),磁盘(二维表)在定义结构的时候就已经确定了最终数据的存储长度。
char(L):L代表length,代表可以存储的长度,单位为字符,最大长度值可以为255.(字符大于等于一个字节)。
cha(4):在UTF8环境下,需要4 * 3 = 12个字节。
变长字符串
变长字符串:varchar,在分配空间时,按照最大的空间分配,但是最终用了多少,是根据具体的数据来定的。
varchar(L):L代表字符长度,理论长度是65536个字符,但是会多出1到2个字节用来存储实际长度。但是实际上如果长度超过了255,既不用定长也不用变长字符串,而是用文本字符创text存储
varchar(10):的确存了10个汉字,utf8环境下使用了10 * 3 + 1= 31个字节。
存储了3个汉字,3 *3 + 1 = 9个字节。
文本字符串
如果数据量非常大,通常说超过了255个字符就会使用文本字符串存储。
文本字符串根据存储的数据格式进行分类:test和blob
test:存储本子(二进制数据实际上都是存储路径)
blob:存储二进制数据,如图片(通常不用,太占用空间)
定长与变长字符串的区别
定长的磁盘空间比较浪费,但是效率高:如果数据基本上确定长度都一样,就是用定长,如身份证、电话号码、手机号码。
变长的磁盘空间比较节省,但是效率低,如果数据不能确定长度(不同数据有变化)如姓名,家庭住址等。
版权声明: 本文为 InfoQ 作者【少林寺三毛】的原创文章。
原文链接:【http://xie.infoq.cn/article/b6b6d8f47e9d41351be5cad44】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论