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个字节 |