在mysql的表设计中我们常常会看到int(10)和int(11)
它们分别代表什么意思呢?能存储更多的值吗?
如果你认为是代表字段存储空间的大小,那应该好好看看!
Github issues:https://github.com/littlejoyo/Blog/issues/
1.场景复现
在数据库的表设计中我们常常会看到
int(11)
、tinyint(4)
、varchar(255)
的表示那么到底他们存储的范围和表示的含义有什么区别呢?
2.含义解释
int(M) M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关
int(10)与int(11)后的括号中的字符表示显示宽度
整数列的显示宽度与mysql需要用多少个字符来显示该列数值
与该整数需要的存储空间的大小都没有关系
int类型的字段能存储的数据上限还是2147483647(有符号型)和4294967295(无符号型)。
3.代表宽度的M有什么用呢?
该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。
显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。
例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。
3.纠正误区
这里的M代表的并不是存储在数据库中的具体的长度,而是表示出来的宽度。
以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的。
其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度
计算机中一个字节包含8bit,那么int类型就有32bit,能表示的范围是 -2147483648~2147483647
在使用int(3)的时候如果你输入的是
10
,会默认给你存储位010
,也就是说这个3代表的是默认的一个宽度当你不足3位时,会帮你补全到3位的宽度,当你超过3位时,就没有任何的影响。
int(10)与int(11),他们之间除了在存储的时候数值宽度稍微有点区别外,在我们使用的时候是没有任何区别的。
int(10)也可以代表
2147483647
这个值int(11)也可以代表。
4.如何测试效果
在字段创建类型的时候加
zerofill
这个值,表示用0填充这样数值在数据库的表示形式就是以M为宽度并用0去填充
如图所示:
但是,我们通常在创建数据库的时候都不会加入这个选项,所以可以说他们之间几乎是没有区别的
5.整数类型存储范围
Mysql中提供表示整数类型的有:
tinyint
、smallint
、middleint
、int
、bigint
分别能表示的字节数:1、2、3、4、8
各自表示的整数范围:
类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
(带符号的/无符号的) | (带符号的/无符号的) | ||
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 | 4 | -9223372036854775808 | 9223372036854775807 |
0 | 18446744073709551615 |
掌握整数型能表示的范围,对数据库字段的设计至关重要!
微信公众号
扫一扫关注Joyo说公众号,共同学习和研究开发技术。