当我们定义一个整型列是经常会在类型后面的括号中加上一个宽度,比如下面语句括号中的数字3
。
create table demo
(
number int(3)
);
这个宽度是代表可以存储的整型的长度么?我们尝试以下的SQL。
insert into demo(number) values (12345);
select * from demo;
+--------+
| number |
+--------+
| 12345 |
+--------+
我们看到12345这个数值长度是超过3的,因此括号中的数字并不是我们猜想的那样用来限制整型的长度。
实际上这个宽度需要配合zerofill
才能发挥作用,我们重新创建上面的表,在定义number
列时加上zerofill
属性,并再次执行上面的插入语句。
drop table demo;
create table demo
(
number int(3) zerofill
);
insert into demo(number) values (12345);
insert into demo(number) values (1);
这时我们再观察查询结果,发现第二次插入的数据1之前有0补位并且补位后的长度正好是3,而12345这个数值没有任何变化。
+--------+
| number |
+--------+
| 12345 |
| 001 |
+--------+
因此我们得出结论,对于整数类型的宽度,当插入的数据长度不足时就在前面用0补足,而对于达到或者超过长度的数据则没有任何效果。实际上整数类型的宽度仅仅影响客户端的显示,并不影响数据库的存储和计算,也就是说int(3)
和int(11)
的存储格式其实是一样的。