MySQL字段类型简介
MySQL的数据类型非常多,这节只介绍数据类型,下节介绍如何正确选择优化的数据类型。
整数类型
存储整数可选择这几种类型 :TINYINT,SMALLINT,MEDIUINT,INT,BIGINT。分别是8,16,24,32,64位存储空间。可以存储的值的范围从-2的(N-1)次方到2的(N-1)次方-1,N是存储空间位数。
UNSIGNED是整数类型可选属性,表示不允许负数,这样一来存储的整数可能大一倍。比如TINYINT可存储范围是-128 ~ 127,TINYINT UNSIGNED可存储范围是0 ~ 255。
当我们为整数类型指定长度时,比例INT(11),其实对大多数应用是没有作用的:不会限制存储的范围,只规定了MySQL的一些交互工具显示的字符数。对存储来讲,INT(1)和INT(10)是相同的。
实数类型
实数带有小数点。可选的类型有:FLOAT,DOUBLE,DECIMAL。其中FLOAT和DOUBLE支持浮点运算,FLOAT占用4个字节,DOUBLE占用8个字节。在MySQL5.0更高的版本中DECIMAL支持精确计算,采用的是MySQL服务实现的高精度计算,因此比浮点计算慢些。
因为占用更多的存储空间和复杂的计算,只有在对小数进行精确计算时才推荐使用DECIMAL。其实也有另一种实现方案:用BIGINT替代DECIMAL。将要存储的数字转换成最小单位,消除小数后存储到BIGINT,取出数据之后再除以小数倍数即可。例如存储RMB金额100.12,将100.12*100 = 10012,存储到BIGINT。查询出之后在程序中将10012 / 100 = 100.12还原。这样就避免了浮点运算不精确和DECIMAL代价较高的问题。
字符串类型
常见的有变长VARCHAR和固定长度的CHAR。变长的VARCHAR理论上更节省存储空间。但并非所有情况都是如此,这个问题下节再讨论。CHAR类型是定长的,MySQL问题分配足够的空间。
还有BINARY和VARBINARY,用来储存二进制字符串,储存的是字节码。有时候存储二进制字节码用来比较很有优势:1,大小写敏感;2,比较BINARY字符串时,每次按一个字节的数值比较,因此更简单也更快。
大字段
字符类型有:TINYTEXT,SMALLTEXT,TEXT,MEDIUTEXT,LONGTEXT;
二进制类型有:TINYBLOB,SMALLBLOB,BLOB,MEDIUBLOB,LONGBLOB。
TEXT是SMALLTEXT的同义词,BLOB是SMALLBLOB的同义词。
日期类型
日期类型有DATE,TIME,YEAR,DATETIME,TIMESTAMP。
日期类型一般可选性不多,主要是DATETIME和TIMESTAMP之间的区别:
保存范围
|
时区有关
|
存储空间
|
|
DATETIME
|
1001年 ~ 9999年
|
否
|
8字节
|
TIMESTAMP
|
1970年 ~2038年
|
是
|
4字节
|
如果没有特殊情况,一般尽量使用TIMESTAMP,如果要求时区相关就必须使用TIMESTAMP,还有就是TIMESTAMP保存的是1970年以来的秒数,和UNIX时间戳是一样的,4个字节的存储比DATETIME效率更高。
目前MySQL不支持保存比毫秒更精确度更高的时间,只能自己想办法解决,可以采用将毫秒或者微秒转换成整型保存在BIGINT类型。