首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL int(3) vs int(11) 深度解析:顯示寬度、ZEROFILL 與儲存本質

     編輯:MySQL 資料庫相關知識

核心結論先行

int(M) 中的 M 僅是「顯示寬度」,不限制儲存範圍,不影響儲存體積(永遠 4 bytes)。只有搭配 ZEROFILL 時,M 才會在輸出時左補 0 至 M 位;否則 int(3) 與 int(11) 完全等價。

一、實測驗證

1. 建表與插入

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);

2. 查詢結果

表定義SELECT * 結果
t1INT(3) ZEROFILL010
t2INT(10) ZEROFILL0000000010
t3INT (無 ZEROFILL)10

二、為什麼會有這個誤區?

  • 早期文檔未明確說明 M 僅為「顯示寬度」。
  • 許多 ORM/遷移工具預設生成 int(11),形成慣例。
  • ZEROFILL 隱含 UNSIGNED,實務極少用,導致 M 的效果鮮被觀察到。

三、整數類型完整對照表

類型儲存空間有號範圍無號範圍預設 M
TINYINT1 byte-128 ~ 1270 ~ 2554
SMALLINT2 bytes-32,768 ~ 32,7670 ~ 65,5356
MEDIUMINT3 bytes-8,388,608 ~ 8,388,6070 ~ 16,777,2159
INT4 bytes-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,29511
BIGINT8 bytes-9.22e18 ~ 9.22e180 ~ 1.84e1920

四、實務建議

  1. 不用 ZEROFILL 時,直接寫 INT 或 INT(11) 皆可,無需糾結數字。
  2. 需限制數值範圍請用 CHECK 約束(MySQL 8.0.16+)或應用層校驗,而非依賴 M。
  3. 極大數值用 BIGINT,極小用 TINYINT/SMALLINT 節省空間,尤其在大表索引中效果顯著。
  4. ZEROFILL 會隱式加 UNSIGNED,若業務需負數請勿使用。

五、一句話總結

int(M) 的 M 只是「顯示時的最小寬度」,不影響儲存、不限制範圍、不加 ZEROFILL 就沒任何可見差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved