萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL INT(M) 顯示寬度深度解析:M 不限制儲存範圍、ZEROFILL 填零、儲存空間與 JOIN 陷阱

核心結論

INT(M) 中的 M 僅為「顯示寬度」,完全不限制儲存範圍、不影響儲存空間。

  • INT 固定佔 4 位元組 (32 位),有號範圍 -2^31 ~ 2^31-1,無號 0 ~ 2^32-1
  • BIGINT 固定 8 位元組 (64 位)
  • M 只影響 ZEROFILL 時的左側填零顯示

ZEROFILL 實測


CREATE TABLE t (
    c1 INT(5) ZEROFILL,
    c2 INT(3) ZEROFILL
);
INSERT INTO t VALUES (4, 4), (12345, 12345);
SELECT * FROM t;
-- 結果:
-- c1     | c2
-- 00004  | 004
-- 12345  | 12345  (超過寬度不截斷)

注意:ZEROFILL 隱含 UNSIGNED。

JOIN 臨時表陷阱 (官方文檔警告)

若在整數欄位儲存超過顯示寬度的值,MySQL 建立複雜 JOIN 臨時表時會「信任」原始寬度,可能導致資料截斷或錯誤。

實務建議:不要依賴 M 限制資料,業務邏輯在應用層驗證。

整數類型儲存空間對照

類型位元組有號範圍無號範圍
TINYINT1-128 ~ 1270 ~ 255
SMALLINT2-32768 ~ 327670 ~ 65535
MEDIUMINT3-8388608 ~ 83886070 ~ 16777215
INT / INTEGER4-2147483648 ~ 21474836470 ~ 4294967295
BIGINT8-2^63 ~ 2^63-10 ~ 2^64-1

最佳實踐

  1. 選型依據:**實際數值範圍**,選最小滿足的類型 (節省空間、索引更快)
  2. 顯示格式化:應用層 String.format("%05d", id) 或 LPAD(id, 5, '0') (SQL)
  3. 避免 ZEROFILL:綁定顯示邏輯於資料庫、遷移困難
  4. JOIN 欄位型別**完全一致** (含 UNSIGNED),避免隱含轉換導致索引失效
copyright © 萬盛學電腦網 all rights reserved