Mysql 我们平时创建一个表对 int 类型习惯设置 int(11) ,不知道你有没有试过设置其他长度有什么影响吗?
下面咱们来实验一下啦。
以下是每个整数类型的存储和范围:
类型 | 字节 | 最小值 | 最大值 |
(带符号的/无符号的) | (带符号的/无符号的) | ||
TINYINT | 1 | -128 | 127 |
0 | 255 | ||
SMALLINT | 2 | -32768 | 32767 |
0 | 65535 | ||
MEDIUMINT | 3 | -8388608 | 8388607 |
0 | 16777215 | ||
INT | 4 | -2147483648 | 2147483647 |
0 | 4294967295 | ||
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
0 | 18446744073709551615 |
第二列是字节,我们学过一个字节 byte 是 8 个位 bit,字节不是计算机存储的最小单位,位才是,一个位代表一个 0 或者 1 ,8 个位 bit 组成一个字节,一般一个字节用 B 来表示 byte ,用小写 b 来表示 bit 。
计算机存储单位的换算:
1B=8b
1KB=1024B
1MB=1024KB
根据 int 类型允许存储的字节数是 4 个字节, 我们就能换算出 int 类型 UNSIGNED (无符号)类型的能存储的最小值为 0 , 最大值为 4294967295 (即 4B=32b, 最大值即为 32 个 1 组成);
二我们建表时设置的长度 int(11) 或者设置成 int(3)或 int(6),
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`i1` int(3) unsigned zerofill DEFAULT NULL,
`i2` int(6) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
其实都是可以存储 4 个字节的无符号整数的。当有设置 zerofill 时,数字不足3位或6位时,前面会用 0 补齐
Mysql 还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(比如INT(6))。
该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。
显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
也就是说,int 的长度并不影响数据的存储精度,长度只和显示有关,为了让大家看的更清楚,我们在上面例子的建表语句中,使用了 zerofill。