【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填充,否則是看不出效果的。
因為通常我們在創建數據庫表字段時都不會加入這個屬性,所以可以說兩者之間是沒有區別的。
綜上所述:只可能對數據存儲有差異。
Good Good Study, Day Day Up.
順序 選擇 循環 總結
