在phpMyAdmin里面, 设置一个int型, 出来是显示长度是INT(11)
. 咦, 不是说这个INT是四字节嘛.怎么是11了??
去查看一下资料, 原来这个11指的是最大显示宽度
. 就是说该列显示出来的长度. INT四字节范围是[-2147483648,2147483647], 这个最大值长度是10, 加上正负号, 所以就正好是11!
那么我们设置1是不是就不能储存10呢? 答案是否定的. 很混淆对吧..
MySQL说明里有 这个长度/值
用”M”来表示的, M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关.
那么究竟这个M有啥用呢..在phpMyAdmin里面可以设置不足为补0 (属性->UNSIGNED ZEROFILL
),这个功能是, 长度不够时往左侧补0. 明白了吧, 如果M设置是5, 那么数是1时, 那么显示就是00001
. 换句话说, 这个长度/值
是显示的长度, 和实际储存占用大小无关. 这个显示的长度对于CAT, JOIN等操作时可能会存在影响. 所以还是最好设置到合适的长度. 对于浮点型同理.
但这个长度对于字符串型的情况就不同了, 设置的长度就和占用的长度相关了, CHAR和VARCHAR前者是实际需要占用的(会更快), 后者是可变长度的最大值(可能更省, 但更慢, 不适合做索引).
下表是实际MySQL支持的整数及范围 (BOOLEAN
实际是TINYINT(1)
).
类型 | 字节 | 最小值 | 最大值 | 默认长度 |
---|---|---|---|---|
TINYINT | 1 | -128 | 127 | 4 |
UNSIGNED | 0 | 255 | 3 | |
SMALLINT | 2 | -32768 | 32767 | 6 |
UNSIGNED | 0 | 65535 | 5 | |
MEDIUMINT | 3 | -8388608 | 8388607 | 8 |
UNSIGNED | 0 | 16777215 | 8 | |
INT | 4 | -2147483648 | 2147483647 | 11 |
UNSIGNED | 0 | 4294967295 | 10 | |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 | 20 |
UNSIGNED | 0 | 18446744073709551615 | 20 |