引言
我们有时候在面试的时候,面试官会问到有关数据库的相关问题,有时就会被问到:在mysql中创建一个表,有个id的字段为int类型,那么这个int后面的数字有什么作用么,这个数字会不会就是字段设置上限值得时候使用的呢,int(1) 和 int(10) 有什么区别?下面我们就来创建一个user表,来看一看这两有什么区别:
我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295,将近40亿,难道用了int(1),就不能达到这个最大值吗?
代码解读
复制代码
CREATE TABLE `user` (
`userId` int(1) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
userId字段为无符号的int(1),我来插入一个最大值看看。
sql
代码解读
复制代码
mysql> INSERT INTO `user` (`userId`) VALUES (4294967295);
我们可以看到这条数据是成功插入了,说明int后面的数字,不影响int本身支持的大小,int(1)、和int(10)实际上是没什么区别的。
使用0来作为填充
int后面的数字实际上是配合zerofill一起使用才有效。我们来看一个例子:
sql
代码解读
复制代码
CREATE TABLE `user` (
`userId` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
注意int(4)后面加了个zerofill,我们先来插入条数据。
scss
代码解读
复制代码
mysql> INSERT INTO `user` (`userId`) VALUES (1),(10),(100),(1000);
分别成功插入了userId = 1、10、100、1000 4条数据,然后我们来查询下:
sql
代码解读
复制代码
mysql> select * from user;
通过查询刚刚插入的数据可以发现 int(4) + zerofill实现了不足4位补0的现象,但不使用zerofill int(4)是没有用的。而且对于0001这种,数据库底层存储的还是1,只是在展示的会补0。
总结
int后面的数字不能表示字段的长度,int(1)和int(10)是没有区别的,但当int(num)一般加上zerofill,才有效果。
zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 ... 999这种,这样可以很直观的表示数据,方便处理而且还更加美观。