【1】int(3) 和 int(11)的区别(思维惯性认知错误)
这里的3或11代表的是存储在数据库中的具体的长度,总以为int(3)只能存储3个长度的数字,int(11)只会存储11个长度的数字。
【2】Mysql基础知识
学习Mysql基本数据类型时,我们已知:
从声明字段是int类型的那一刻起,int类型的字段就是占四个字节,一个字节8位,也就是4*8=32位。
因此,可以表示的数字个数是2的32次方(2^32 = 4294 9672 96个数字)
而4294 9672 96个数字也就是[0, 4294967295],当然,如果区分正负号的话所存的数值会比较小。
另外,zerofill属性的作用:
(1)插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应长度的0
(2)zerofill默认为int(10)
(3)当使用zerofill时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍。
例如,有符号为[-2147483648,2147483647],无符号为[0, 4294967295]。
【3】SQL学习实例
(1)SQL语句
-- 本地Mysql版本V8.0.12 -- --------------------------BEGIN ZEROFILL----------------- -- [1]存在先删除 DROP TABLE students; -- [2]创建表 CREATE TABLE `students` ( `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `sName` VARCHAR(100) NOT NULL, `sAge` INT(2) ZEROFILL NOT NULL, `sAddr` VARCHAR(200) DEFAULT NULL, `sGrade` INT(2) DEFAULT NULL, `sStuId` INT(8) DEFAULT NULL, `sSex` INT(1) UNSIGNED DEFAULT NULL, `sReverse_00` INT(10) ZEROFILL DEFAULT NULL, `sReverse_01` INT(11) UNSIGNED DEFAULT NULL, `sReverse_02` INT(11) ZEROFILL UNSIGNED DEFAULT NULL, PRIMARY KEY (`sId`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4; -- [3]插入源数据 INSERT INTO students(sName, sAge, sAddr, sGrade, sStuId, sSex, sReverse_00, sReverse_01, sReverse_02) VALUES ('wangchao', 8, 'heyang', 3, 1803111, 0, 4294967296, 4294967296, 4294967296), ('suntao', 9, 'weinan', 6, 1806110, 1, 4294967296, 4294967296, 4294967296), ('liuyan', 16, 'hancheng', 8, 20190811, 0, 4294967296, 4294967296, 4294967296), ('xuhui', 22, 'hancheng', 12, 201912107, 1, 42949672969, 4294967296, 4294967296); -- [4]查询数据信息 SELECT sId, sName, sAge, LENGTH(sAge) AS len_Age, sAddr, sGrade, LENGTH(sGrade) AS len_Grade, sStuId, LENGTH(sStuId) AS len_StuId, sSex, sReverse_00, LENGTH(sReverse_00) AS len_Reverse00, sReverse_01, LENGTH(sReverse_01) AS len_Reverse01, sReverse_02, LENGTH(sReverse_02) AS len_Reverse02 FROM students; -- [5]查询数据长度 SELECT sId, sName, sAge, LENGTH(sAge) AS len_Age FROM students; SELECT sId, sName, sGrade, LENGTH(sGrade) AS len_Grade FROM students; SELECT sId, sName, sStuId, LENGTH(sStuId) AS len_StuId FROM students; SELECT sId, sName, sReverse_02, LENGTH(sReverse_02) AS len_Reverse02 FROM students; -- --------------------------END ZEROFILL-----------------
(2)查询结果数据集
(3)结果分析
其实,当我们在选择使用int类型时,不论是选择int(3)还是int(11),它在数据库里面存储的都是4个字节的长度。
只不过在使用int(3)且加zerofill属性时,如果你输入的数值是17,系统会默认为你存储值为017,什么意思呢?
即就是说,这个3代表的仅是一个默认的长度,当不足3位时,系统会帮用零补全,当超过3位时,就没有任何的影响与副作用。
两者之间除了在存储的时候稍微有点区别外,当我们在使用数据时是没有任何差异的。
实际中,要看出两者的不同效果,需要在创建表时字段类型后加zerofill这个属性,表示用0填充,否则是看不出效果的。
因为通常我们在创建数据库表字段时都不会加入这个属性,所以可以说两者之间是没有区别的。