一、MySQL 中 int(1) 和 int(10)
在MySQL
数据库设计中,经常会遇到 int
类型的字段,并会习惯性的指定长度,比如: int(1)
和int(10)
,而一些新手可能会误解它们之间的关系,认为 int(10)
能够存储更多的数据。然而,实际上这两者之间的区别并非是存储容量上的不同,而是涉及到显示的问题。
首先,需要明确的是,int(1)
和int(10)
在数据存储大小和范围上并没有任何区别。无论是int(1)
还是int(10)
,在MySQL
中都是占4
个字节,其范围从-2147483648 ~ 2147483647
。这是因为int
数据类型的存储大小是固定的,显示宽度并不会改变它们的实际存储能力。
比如有表结构如下:
CREATE TABLE `test` (`id` bigint(10) NOT NULL AUTO_INCREMENT,`num1` int(1) NOT NULL,`num2` int(10) NOT NULL,`num3` int(1) unsigned NOT NULL,`num4` int(10) unsigned NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
其中num1
和num2
是允许负数,长度分别为1
和 10
,num3
和num4
是允许非负数,长度同样分别为1
和 10
。
下面测试下num1
和num2
写入最大值 2147483647
, num3
和num4
写入最大值 4294967295
会怎么样:
INSERT INTO test(num1,num2,num3,num4) VALUES (2147483647,2147483647,4294967295,4294967295 );
可以看到不管是 int(1)
还是 int(10)
都不影响写入数据的长度,下面对数据查询看是否影响展现:
可以看到展现上也没有影响,既然查看也没有区别,为什么前面说会涉及到显示的问题呢?
其实要搭配 zerofill
一起使用才有效。
比如定义下面表结构,对int
类型指定 zerofill
:
CREATE TABLE `test1` (`id` bigint(10) NOT NULL AUTO_INCREMENT,`num1` int(1) zerofill NOT NULL,`num2` int(10) zerofill NOT NULL,`num3` int(1) unsigned zerofill NOT NULL,`num4` int(10) unsigned zerofill NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
下面写入一个比较小的数:
INSERT INTO test1(num1,num2,num3,num4) VALUES (123,123,123,123);
下面查看下展示效果:
可以看出 int(10)
的字段,如果长度不足 10
还会在前面补充 0
。
如果写入的内容比较大:
INSERT INTO test1(num1,num2,num3,num4) VALUES (2147483647,2147483647,4294967295,4294967295 );
再次查看,也丝毫不影响 int(1)
的展现:
总结:int
后面的数字不能表示字段的长度,一般配合 zerofill
,实现位数不足时补充 0
的效果。