MySql int(1) 和 int(10) 有什么区别?
MySql int(1) 和 int(10) 有什么区别?
MySql 知识点总结之(int(1) 和 int(10) 有什么区别?)
先说结论
正常来说,没有区别。 后面带的数字,并不是长度的概念。 Int 类型就是占用4个字节(32位), Int(1), int(10) 都一样是4个字节/32位,数据范围也还是-2^31 ~ 2^31-1。
困惑
对于日常建表过程中,大家普遍认为在使用过程中int(10)通常表示数值长度的位数;包括我经常在也看到同事也一直使用int(10),感觉用了int(1),字段的上限就被限制,真实情况肯定不是这样。
数据说话
我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295,将近40亿,难道用了int(1),就不能达到这个最大值吗?
1 |
|
id字段为无符号的int(1),我来插入一个最大值看看。
1 |
|
可以看到成功了,说明int后面的数字,不影响int本身支持的大小,int(1)、int(2)…int(10)没什么区别。
官方解释
1 |
|
翻译过来就是,在 integer 数据类型中,M 表示最大显示宽度。
也就是说,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用4 bytes的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
另外,int(M) 只有跟
1 |
|
结合起来,才能更清楚的看到它的具体含义。
1 |
|
从上面的测试可以看出,“(M)”指定了 int 型数值显示的宽度,如果字段数据类型是 int(4),那么当显示数值 10 时,在左边要补上 “00”;当显示数值 100 是,在左边要补上“0”;当显示数值 1000000 时,已经超过了指定宽度“(4)”,因此按原样输出。
因此,在使用 MySQL 数据类型中的整数类型(tinyint、smallint、 mediumint、 int/integer、bigint)时,非特殊需求下,在数据类型后加个“(M)”,是没有任何意义的。
int(1)和int(11)在实际使用中,如果不使用 zerofill 是没有任何区别的,而且int型最大只能存储4294967295这个整数,也就是只有10位。
结论
综上所述,当我们需要用整形来存储一个字段类型的时候,应该尽量估算出该字段所需要的实际长度,比如tinyint可存储无符号最大值是255(1个字节长度,即2的8次方),smallint可存储无符号最大值是65535(2个字节长度,即2的16次方),mediumint可存储无符号最大值是16777215(3个字节长度,即2的24次方),而int型最大可存储4294967295(3个字节长度,即2的32次方)。