很多開發者誤以為 int(3) 只能存 3 位數字、int(11) 存 11 位,實則不然。括號內數字僅為「顯示寬度」,不限制存儲範圍、不影響磁盤佔用,只有配合 ZEROFILL 才有零填充效果。
| 定義 | 存儲字節 | 有符號範圍 | 無符號範圍 | 顯示寬度作用 |
|---|---|---|---|---|
| INT / INT(11) | 4 bytes | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 默認 11,僅影響 ZEROFILL 填充位數 |
| INT(3) | 4 bytes | 同上 | 同上 | 默認 3,同樣只影響 ZEROFILL |
| 類型 | 字節 | 默認顯示寬度 | 有符號範圍 | 無符號範圍 |
|---|---|---|---|---|
| TINYINT | 1 | 4 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | 6 | -32,768 ~ 32,767 | 0 ~ 65,535 |
| MEDIUMINT | 3 | 9 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
| INT / INTEGER | 4 | 11 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
| BIGINT | 8 | 20 | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 |
int(3) 存不下 1000。事實:存得下,顯示寬度 3 不限制值域。int(11) 比 int(3) 佔用更多空間。事實:均佔 4 字節。ZEROFILL 是業務邏輯必需。事實:純屬顯示層面,應用層格式化更靈活,建議不使用。INT、BIGINT,省去無意義的顯示寬度。UNSIGNED 獲得雙倍正數範圍(如用戶 ID、商品 ID)。String.format("%011d", id) 或 LPAD(id, 11, '0') 處理,勿依賴數據庫顯示屬性。INT(11) 可保持不變,新表統一簡寫。INT(M) 中的 M 只是「顯示寬度提示」,不限制存儲範圍、不改變佔用字節、不影響性能。唯一可見行為差異是配合 ZEROFILL 時的左側零填充。現代開發規範建議:拋棄顯示寬度,直接使用類型名;零填充交給應用層;非負字段加 UNSIGNED。