MySQL 中 int(11) 和 int(10) 到底有没有区别?
引言
依稀还记得有次面试,有面试官问我int(10)
与int(11)
有什么区别,当时觉得就是长度的区别吧!面试官最后也没有给反馈,我也就以为自己答对了。直到有一次有个同学又跟我谈起这个事,才去查了以下,发现事情并没有哪么简单… …
最后查出的结果是:这里的M
代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)
只能存储 3个长度的数字,int(11)
就会存储 11 个长度的数字,这是大错特错的。
int(10)
也可以代表 2147483647 这个值int(11)
也可以代表。
要查看出不同效果记得在创建类型的时候加 zerofill
这个值,表示用 0 填充,否则看不出效果的。
我们通常在创建数据库的时候都不会加入这个选项,所以可以说他们之间是没有区别的。
声明字段是int类型的那一刻起,int
就是占四个字节,一个字节 8 位,也就是4*8=32
,可以表示的数字个数是 2的 32 次方(2^32 = 4 294 967 296个数字)
。
4 294 967 296
个数字也就是0~4 294 967 295
,当然如果区分正负号的话所存的数字会比较小。
知识点
int(M)
中的M
指示最大显示宽度,最大有效显示宽度是 255,且显示宽度与存储大小或类型包含的值的范围无关。
首先说一下 MySQL 的数值类型,MySQL 支持所有标准 SQL 数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC)
,以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)
。关键字 INT
是 INTEGER
的同义词,关键字 DEC
是DECIMAL
的同义词。
BIT 数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB
和 BDB
表。 作为 SQL 标准的扩展,MySQL 也支持整数类型TINYINT、MEDIUMINT 和 BIGINT
。下面的表显示了需要的每个整数类型的存储和范围。
MySQL 类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4)
)。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
当结合可选扩展属性 ZEROFILL
使用时, 默认补充的空格用零代替。例如,对于声明为 INT(5) ZEROFILL
的列,值 4 检索为 00004。请注意如果在整数列保存超过显示宽度的一个值,当 MySQL 为复杂联接生成临时表时会遇到问题,因为在这些情况下 MySQL 相信数据适合原列宽度。
所有整数类型可以有一个可选(非标准)属性 UNSIGNED
。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。
总结
所以,int(2)
与int(11)
后的括号中的字符表示显示宽度,整数列的显示宽度与 MySQL 需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,int
类型的字段能存储的数据上限依旧是2147483647(有符号型)和4294967295(无符号型)。
版权声明: 本文为 InfoQ 作者【周三不加班】的原创文章。
原文链接:【http://xie.infoq.cn/article/b77e5d4c36293b229b5db79c9】。文章转载请联系作者。
评论