【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 TABLEstudents;--[2]创建表
CREATE TABLE`students` (
`sId`INT(20) UNSIGNED NOT NULLAUTO_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 INTOstudents(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) ASlen_Age, sAddr,
sGrade, LENGTH(sGrade)ASlen_Grade,
sStuId, LENGTH(sStuId)ASlen_StuId,
sSex,
sReverse_00, LENGTH(sReverse_00)ASlen_Reverse00,
sReverse_01, LENGTH(sReverse_01)ASlen_Reverse01,
sReverse_02, LENGTH(sReverse_02)ASlen_Reverse02FROMstudents;--[5]查询数据长度
SELECT sId, sName, sAge, LENGTH(sAge) AS len_Age FROMstudents;SELECT sId, sName, sGrade, LENGTH(sGrade) AS len_Grade FROMstudents;SELECT sId, sName, sStuId, LENGTH(sStuId) AS len_StuId FROMstudents;SELECT sId, sName, sReverse_02, LENGTH(sReverse_02) AS len_Reverse02 FROMstudents;----------------------------END ZEROFILL-----------------
(2)查询结果数据集
(3)结果分析
其实,当我们在选择使用int类型时,不论是选择int(3)还是int(11),它在数据库里面存储的都是4个字节的长度。
只不过在使用int(3)且加zerofill属性时,如果你输入的数值是17,系统会默认为你存储值为017,什么意思呢?
即就是说,这个3代表的仅是一个默认的长度,当不足3位时,系统会帮用零补全,当超过3位时,就没有任何的影响与副作用。
两者之间除了在存储的时候稍微有点区别外,当我们在使用数据时是没有任何差异的。
实际中,要看出两者的不同效果,需要在创建表时字段类型后加zerofill这个属性,表示用0填充,否则是看不出效果的。
因为通常我们在创建数据库表字段时都不会加入这个属性,所以可以说两者之间是没有区别的。
综上所述:只可能对数据存储有差异。
Good Good Study, Day Day Up.
顺序 选择 循环 总结