在工作的时候,看到数据库表很多int类型的字段都是int(11),但是int的取值范围为: -2^31——2^31-1,即-2147483648——2147483647,最大为十位数字,那设计字段类型为int(11)有什么意义呢?

刚开始的时候,我以为int(M)中M代表着限制int的长度为M位,最近才想起来好像不怎么对,然后去网上查才发现,M代表的并不是长度,而是字符的显示宽度,在字段类型为int时,无论你显示宽度设置为多少,int类型能存储的最大值和最小值永远都是固定的

下面开始实验证明:

  • 创建一张表
CREATE TABLE test_int (
 id INT (11) NOT NULL AUTO_INCREMENT,
 a INT (11) NOT NULL,
 b INT (11) UNSIGNED ZEROFILL NOT NULL,
 c INT (5) DEFAULT NULL,
 d INT (5) UNSIGNED ZEROFILL NOT NULL,
 e INT (15) DEFAULT NULL,
 PRIMARY KEY (`id`) 
)
  • 插入几条数据
INSERT INTO test_int (a, b, c, d, e) VALUES (1, 1, 1, 1, 1);
INSERT INTO test_int (a, b, c, d, e) VALUES (1234567890, 1234567890, 1234567890, 1234567890, 1234567890);
INSERT INTO test_int (a, b, c, d, e) VALUES (12345678910, 12345678910, 12345678910, 12345678910, 12345678910);

这一步证明了,int类型最大只能插入十位数字

  • 查询数据
select * from test_int;
id a b c d e
1 1 00000000001 1 00001 1
2 1234567890 01234567890 1234567890 1234567890 1234567890

如果用navicat查询结果是没有显示左边的0,但是导出之后就可以看到了

  • 结论

这个11代表显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,所以如果认为int(5)只能存储5个长度的数字,int(11)就会存储11个长度的数字,这是错误的。 它在数据库里面存储的都是4个字节的长度,在使用int(5)的时候如果你输入的是1,会默认给你存储00001,也就是说这个5代表的是字符宽度,当你不足5位时,会帮你补全,当你超过5位时,就没有任何的影响。

当int字段类型设置为无符号且填充零(UNSIGNED ZEROFILL)时,当数值位数未达到设置的显示宽度时,会在数值前面补充零直到满足设定的显示宽度,为什么会有无符号的限制呢,是因为ZEROFILL属性会隐式地将数值转为无符号型,因此不能存储负的数值。