当前位置: 首页 > 科技观察

MySQL中Int(3)和Int(6)的取值范围是一样的吗?

时间:2023-03-12 19:58:45 科技观察

本文转载自微信公众号《大数据技术学堂》,作者柯柯。转载本文请联系大数据技术群公众号。问题:Mysql字段unsignedint(3)和unsingedint(6)可以存储相同的取值范围。如果不同,它们有多大?答:不同,int(3)最多可以显示3位无符号整数,int(6)最多可以显示6位无符号数。如果你的回答与上面一致,恭喜你犯了和我一样的错误。真实情况:int类型整数占4个字节,有符号范围为:-2^31~2^31-1,无符号整数范围为:0~2^32-1,因为都是无符号整数,那么存储范围相同,int(6)只在小于6位时补0,超过6位则不补。我们创建下表:droptableifexiststest;创建表`test`(`id`int(11)NOTNULLAUTO_INCREMENT,`a`int(11)NOTNULL,`b`int(11)unsignedzerofillNOTNULL,`c`int(5)DEFAULTNULL,`d`int(5)unsignedzerofillNOTNULL,`e`int(15)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;插入一些数据后,使用cmd命令行查看:mysql>select*fromtest;+----+------------+-------------+------------+-------------+------------+|id|a|b|c|d|e|+----+-------------+------------+------------+----------+------------+|1|1|00000000001|1|00001|1||2|1234567890|01234567890|1234567890|1234567890|1234567890|+----+------------+------------+------------+------------+--------------+发现int(3)和int(6)都可以显示6位以上的整数。但是,当数字少于3位或6位时,前面会补0。注意:如果使用navicat之类的工具,是不会补0的,可能会被处理。需要使用mysqlcmd命令行才能看到这个效果。查看手册,解释是这样的:MySQL也支持在该类型的关键字(例如INT(4))后的括号内指定整数值显示宽度的选项。可选的显示宽度规范用于在显示小于指定列宽的值时从左边开始填充宽度。显示宽度不限制列内可以容纳的值的范围,也不限制超过列指定宽度的值的显示。也就是说,int的长度不影响数据的存储精度,长度只与显示有关。为了让大家更清楚,我们在上例的建表语句中使用了zerofill。结论:无论是unsignedint(3)还是unsiendint(6),存储的都是4字节无符号整数,即0~2^32。