在设计数据库表的时候,经常需要设计一个id字段,它的类型一般都是整型int,经常会遇到int(1)、int(20)等。
int的范围:
有符号的整型范围是-2147483648~2147483647
无符号的整型范围是0~4294967295
参看 mysql 手册,int(m): m indicates the maximum display width for integer types.
int(m)只是用来显示数据的宽度,在 integer 数据类型中,m 表示最大显示宽度,一般int后面的数字m要配合zerofill一起使用才有效。
数据准备
创建测试表 test_table,包含两个测试字段area_1 int(1)、area_2 int(20):
create table `test_table` ( `id` bigint(20) unsigned not null auto_increment, `area_1` int(1) unsigned default null, `area_2` int(20) unsigned default null, primary key (`id`) ) engine=innodb default charset=utf8mb4;
存储大小
在 mysql 中 int 类型占4个字节,对于无符号整形最大值为:2^32-1 = 4294967295,下面看看int(1)、int(20)分别可以存储 int 类型最大值?
insert into `test_table` (`area_1`, `area_2`) values (4294967295, 4294967295) > affected rows: 1 > 查询时间: 0.002s
插入成功,int(1)、int(20) 都可以存储 int 类型最大值,说明对存储大小无影响。那么1和20用什么作用呢?答案就是对齐填充,当联合零填充(zerofill) 使用时,配置的值才会体现效果。
零填充(zerofill,一般int后面的数字要配合zerofill一起使用才有效)
所谓零填充就是当数字位小于指定位数时,使用0填充补全位数,比如指定位数为4位,数为23,那么实际会被填充为 0023。
将 area_1 和 area_2 字段配置为 zerofill:
create table `test_table` ( `id` bigint(20) unsigned not null auto_increment, `area_1` int(1) unsigned <strong>zerofill</strong> default null, `area_2` int(20) unsigned <strong>zerofill</strong> default null, primary key (`id`) ) engine=innodb auto_increment=3 default charset=utf8mb4;
可以看到 area_2 不足20位时使用0补齐到20位,area_1 指定位数为 1 位实际并没有效果,因为数字至少为1位,对 null 不生效。
零填充(zerofill)在一些需要数字对齐的场景中可能使用,但实践中并不推荐,对数据库依赖性太强。
总结
int后面的数字不能表示字段的长度,int(num)一般加上zerofill,才有效果。
一般整型而言,对于int(1)、int(20) 中指定的位数并不会影响字段的存储大小,而是和零填充(zerofill)联合使用实现对齐填充,实际使用中没有特殊对齐需求,配置为int(1)即可。
注意:零填充只针对于整型,字符串(char、varchar)的“长度”是会受到真正的限制。char(n)、varchar(n),括号里的n表示的是该字段可容纳的最大字符数,简单来说就是能存入多少个字符,n的取值范围为:0-255。
到此这篇关于mysql中int(1)、int(20)的区别小结的文章就介绍到这了,更多相关mysql int(1) int(20)内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论