1. 程式人生 > >Mysql資料型別之zerofill

Mysql資料型別之zerofill

一直被誤導

從去年開始用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在什麼情況下用呢?

zerofill:如果值長度不夠,在前面補0表示。

還是以上面的表為例,id1改回為tinyint(2),插入新資料

ALTER TABLE test MODIFY `id1` TINYINT(2) ZEROFILL;
INSERT INTO test VALUES(1,4);

再查一下表資料:


發現並沒有什麼變化,so?別急,剛才是在window下,現在linux下查詢試試


有了!可以再擴大tinyint(3),tinyint(4),可以看到相應的結果。