Mysql資料型別之zerofill
阿新 • • 發佈:2019-02-11
一直被誤導
從去年開始用Mysql,然後經常看到建表類似語句
當時不明所以,以為是資料型別對應的儲存最大長度,比如tinyint(1),就只能儲存0,1,...9以內數字,11就不行;
所以人云亦云,在自己處理的時候,也這樣設定了長度。
突然,有一天,想查一下(心血來潮),發現一直被誤導了,被自己誤導了。
真相
看一下mysql官網的資料型別定義
以tinyint為例,儲存值在-128~127之間,非負時0-255。建立一個表
CREATE TABLE `test` ( `id1` tinyint(2) DEFAULT NULL, `id2` int(4) unsigned DEFAULT NULL ) ENGINE=InnoDB;
現在插入2條資料
-- 十位數字,猜測能插入
INSERT INTO test VALUES(11,44);
-- 十位數字,猜測不能插入
INSERT INTO test VALUES(111,444);
結果,,都成功了,說明以前的猜測是錯誤的:tinyint(M)的M並不是代表儲存的最大長度
為此,我們再次驗證,將id1改成tinyint(1)
ALTER TABLE test MODIFY `id1` TINYINT(1);
再次插入
發現插入127成功,128失敗,所以得出結論:TYPE(M)的M與儲存並沒有關係
那這個到底有什麼用呢?
zerofill
wtf?TYPE(M)中的M在什麼情況下用呢?
還是以上面的表為例,id1改回為tinyint(2),插入新資料
ALTER TABLE test MODIFY `id1` TINYINT(2) ZEROFILL;
INSERT INTO test VALUES(1,4);
再查一下表資料:
發現並沒有什麼變化,so?別急,剛才是在window下,現在linux下查詢試試
有了!可以再擴大tinyint(3),tinyint(4),可以看到相應的結果。