建表時習慣寫 INT(11)?這裡的 11 到底代表什麼?是限制長度、還是單純預期值?本文用實測數據一次講透。
INT 本身範圍約束)。ZEROFILL 時,查詢結果左補 0 至 M 位。CREATE TABLE test (num INT(5) ZEROFILL); INSERT INTO test VALUES (1), (11), (123), (12345), (123456), (1234567);
+---------+ | num | +---------+ | 00001 | | 00011 | | 00123 | | 12345 | | 123456 | | 1234567 | +---------+
觀察:
INT 有號最大值 2147483647 共 10 位,加上可能的負號共 11 字元,故預設 M=11 可完整顯示所有值而無需補 0。
| 誤區 | 事實 |
|---|---|
INT(3) 只能存 3 位數 | 可存 10 位,INT(3) 與 INT(11) 儲存上限相同 |
| M 影響索引長度 | 索引長度取決於資料類型(INT 固定 4 bytes),與 M 無關 |
| 不加 ZEROFILL 也會補 0 | 只有 ZEROFILL 才補 0,否則純數字輸出 |
INT 或 INT(11),別糾結數字。LPAD(),勿依賴 ZEROFILL(隱含 UNSIGNED 且非標準 SQL)。TINYINT/SMALLINT/MEDIUMINT。