MySQL 獨有的「顯示寬度」語法(如 INT(11)、BIGINT(20))常被誤解為限制儲存長度。本文釐清其真實作用、預設值、與 SQL Server 的差異,避免設計誤區。
CREATE TABLE tb_emp ( id BIGINT(1) );
括號內數字為顯示寬度,指定查詢結果最多顯示的數字字元數(不足時左側補空格)。
| 特性 | 說明 |
|---|---|
| 不影響儲存範圍 | INT(3) 仍佔 4 位元組,允許值 -2147483648 ~ 2147483647 |
| 不影響儲存空間 | 永遠依型別本身(TINYINT 1B、SMALLINT 2B、MEDIUMINT 3B、INT 4B、BIGINT 8B) |
| 超寬度值仍可插入並完整顯示 | 插入 19999 到 YEAR INT(4),SELECT 仍顯示 19999 |
| 僅影響某些客戶端顯示格式 | 配合 ZEROFILL 時,左側補 0 而非空格 |
若不指定,MySQL 依型別給預設值:
TINYINT → 3 或 4(視 UNSIGNED)SMALLINT → 5 或 6MEDIUMINT → 7 或 8INT → 10 或 11BIGINT → 19 或 20-- SQL Server:報錯 CREATE TABLE abc (id INT(11)); -- Msg 2716: 不能對數據類型 int 指定列寬。
SQL Server 無顯示寬度概念,長度控制需靠 CHECK 約束或應用層驗證。
CREATE TABLE t (a INT(5) ZEROFILL, b INT(5)); INSERT INTO t VALUES (12, 12); SELECT * FROM t; -- 結果:a=00012, b=12(b 若為數值型客戶端可能不補空格)
INT(N) 中的 N 只是顯示提示,非長度限制。INT 為 231-1)。CHECK (col BETWEEN 0 AND 999)(8.0.16+ 支援)或應用層驗證。ZEROFILL 可用於單號、流水號格式化顯示。