MySQL 数据类型

整数类型

数据类型 占用空间 可存储的值的范围 UNSIGNED可存储的值的范围
TINYINT 8位 -128 ~ 127 0 ~ 256
SMALLINT 16位 -32768 ~ 32767 0 ~ 65536
MEDIUMINT 24位 -8388608 ~ 8388607 0 ~ 16777216
INT 32位 -2147483648 ~ 2147483647 0 ~ 4294967296
BIGINT 64位 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551616

实数类型

MySQL可以为整数类型指定宽度,例如INT(11),对大多数应用是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具用来显示字符的个数。

MySQL既支持精确类型,也支持不精确类型。

数据类型 占用空间 是否近似
FLOAT 4个字节 近似
DOUBLE 8个字节 近似
DECIMAL / 精确

MySQL使用DOUBLE作为内部浮点计算的类型。

因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL。

字符串类型

数据类型 字符串长度 占用空间 适用场景 额外
VARCHAR 变长 需要使用1或者2个额外字节记录字符串的长度:如果列的长度小于255字节,则只使用1个字节表示,否则使用2个字节 ①字符串列的最大长度比平均长度大很多;②列的更新很少;③使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储 InnoDB 可以把过长的VARCHAR存储为BLOB
CHAR 定长 存储时会删除所有的末尾空格,CHAR值会根据需要采用空格进行填充以方便比较 适合存储很短的字符串,或者所有值都接近同一个长度,例如MD5值;对于经常变更的数据,CHAR也比VARCHAR更好 /

BloB和TEXT类型

BLOB和TEXT都是为了存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。

BLOB和TEXT分别属于两组不同数据类型家族: 字符串类型是TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,LONGTEXT;二进制类型是TINYBLOB,SMALLBLOB,BLOB,MEDIUMBLOB,LONGBLOB。BLOB是SMALLBLOB的同义词,TEXT是SMALLTEXT的同义词。

BLOB和TEXT家族之间仅有的不同是BLOB类型存储的是二进制数据,没有排序规则或者字符集,而TEXT家族有字符集和排序规则。

MySQL对BLOB和TEXT列进行排序与其他类型不同:它只对每个列的最前maxsortlength字节排序而不是整个字符串。

日期和时间类型

数据类型 范围 精度 时区 占用存储空间
DATETIME 1001年 ~ 9999年 与时区无关 8个字节
TIMESTAMP 1970年到2038年 显示的值依赖于时区 4个字节