int(M) 中的 M 僅是「顯示寬度」,不限制儲存範圍,不影響儲存體積(永遠 4 bytes)。只有搭配 ZEROFILL 時,M 才會在輸出時左補 0 至 M 位;否則 int(3) 與 int(11) 完全等價。
CREATE TABLE t1 (c INT(3) ZEROFILL); CREATE TABLE t2 (c INT(10) ZEROFILL); -- 預設寬度 10 CREATE TABLE t3 (c INT); -- 無 ZEROFILL INSERT INTO t1 VALUES (10); INSERT INTO t2 VALUES (10); INSERT INTO t3 VALUES (10);
| 表 | 定義 | SELECT * 結果 |
|---|---|---|
| t1 | INT(3) ZEROFILL | 010 |
| t2 | INT(10) ZEROFILL | 0000000010 |
| t3 | INT (無 ZEROFILL) | 10 |
int(11),形成慣例。ZEROFILL 隱含 UNSIGNED,實務極少用,導致 M 的效果鮮被觀察到。| 類型 | 儲存空間 | 有號範圍 | 無號範圍 | 預設 M |
|---|---|---|---|---|
| TINYINT | 1 byte | -128 ~ 127 | 0 ~ 255 | 4 |
| SMALLINT | 2 bytes | -32,768 ~ 32,767 | 0 ~ 65,535 | 6 |
| MEDIUMINT | 3 bytes | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 9 |
| INT | 4 bytes | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 11 |
| BIGINT | 8 bytes | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 20 |
INT 或 INT(11) 皆可,無需糾結數字。CHECK 約束(MySQL 8.0.16+)或應用層校驗,而非依賴 M。BIGINT,極小用 TINYINT/SMALLINT 節省空間,尤其在大表索引中效果顯著。ZEROFILL 會隱式加 UNSIGNED,若業務需負數請勿使用。int(M) 的 M 只是「顯示時的最小寬度」,不影響儲存、不限制範圍、不加 ZEROFILL 就沒任何可見差異。