初學者常誤以為 int(3) 只能存 3 位數字,int(11) 存 11 位。實則 M 僅是顯示寬度,配合 ZEROFILL 才會在查詢結果左側補 0,不影響存儲範圍與佔用空間。本文通過實測徹底釐清誤區。
int(M) 固定佔用 4 字節,有符號範圍 -2147483648 ~ 2147483647,無符號 0 ~ 4294967295。M(1~255)僅用於查詢結果顯示,不限制插入值大小。ZEROFILL 時,M 才生效:查詢結果左側補 0 至寬度 M。ZEROFILL 隱含 UNSIGNED(無符號)。-- 建表 CREATE TABLE t1 (c INT(3) ZEROFILL); CREATE TABLE t2 (c INT ZEROFILL); -- 預設寬度 10 CREATE TABLE t3 (c INT); -- 無 ZEROFILL -- 插入 8 INSERT INTO t1 SET c=8; -- 查詢結果:008 INSERT INTO t2 SET c=10; -- 查詢結果:0000000010 INSERT INTO t3 SET c=10; -- 查詢結果:10 -- 插入超寬度值 INSERT INTO t1 SET c=12345; -- 查詢結果:12345(不截斷,正常顯示)
| 類型 | 儲存空間 | 有符號範圍 | 無符號範圍 | 預設 M |
|---|---|---|---|---|
| TINYINT | 1 字節 | -128 ~ 127 | 0 ~ 255 | 4 |
| SMALLINT | 2 字節 | -32768 ~ 32767 | 0 ~ 65535 | 6 |
| MEDIUMINT | 3 字節 | -8388608 ~ 8388607 | 0 ~ 16777215 | 9 |
| INT | 4 字節 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | 11 |
| BIGINT | 8 字節 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 | 20 |
INT 等同 INT(11),語義更清晰。LPAD(id, 10, '0'))優於資料庫 ZEROFILL,避免耦合顯示邏輯。INT UNSIGNED AUTO_INCREMENT,無需關心 M。記住:M 是顯示屬性,非存儲屬性,別再被誤導。