一、背景
在创建数据库表的时候,我们经常会用到int(x)来定义一个字段的类型,一直误以为这里的x表示存储数字的长度。
其实大错特错,这里的 x 指的是 最大显示宽度(最大有效显示宽度是255),且显示宽度与存储大小或类型包含的值的范围无关。
二、mysql整数类型
类型 | 字节 | 取值范围 | 显示宽度 |
---|---|---|---|
tinyint | 1 | -128 ~ 127 | 4 |
smallint | 2 | -32768 ~ 32767 | 6 |
mediumint | 3 | -8388608 ~ 8388607 | 9 |
int | 4 | -2147483648 ~ 2147483647 | 11 |
bigint | 8 | -9223372036854775808 ~ 9223372036854775807 | 20 |
MySQL 类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。
该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
当结合可选扩展属性 zerofill 使用时, 默认补充的空格用零代替。
例如,对于声明为 INT(5) zerofill 的列,值 4 检索为 00004。请注意如果在整数列保存超过显示宽度的一个值,当 MySQL 为复杂联接生成临时表时会遇到问题,因为在这些情况下 MySQL 相信数据适合原列宽度。
所有整数类型可以有一个可选(非标准)属性 UNSIGNED。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。
那取值范围和显示宽度到底有什么关系呢?利用 int 做了个实验:
create table int_demo(
id int not null auto_increment,
int_4 int(4) UNSIGNED zerofill,
int_8 int(8) UNSIGNED zerofill,
primary key (id)
);
insert into int_demo (int_4, int_8) VALUES (2, 1000),(123456, 1234567898);
select * from int_demo;
查询结果:
mysql> select * from int_demo;
+----+--------+------------+
| id | int_4 | int_8 |
+----+--------+------------+
| 1 | 0002 | 00001000 |
| 3 | 123456 | 1234567898 |
+----+--------+------------+
2 rows in set (0.00 sec)
总结:
显示宽度整数类型的取值范围是无关的。
显示宽度只是指明 mysql 最大可能显示的数字个数,数值的位数小于指定的宽度时左侧用数字 0 填充。
如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。
到此这篇关于MySQL中int(10)和int(11)的区别详解的文章就介绍到这了,更多相关MySQL int(10)和int(11)内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!