首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL int(3) vs int(11) 區別深度解析:顯示寬度 ≠ 存儲長度

     編輯:MySQL 綜合教學

MySQL int(3) vs int(11) 區別深度解析:顯示寬度 ≠ 存儲長度

很多開發者誤以為 int(3) 只能存 3 位數字、int(11) 存 11 位,實則不然。括號內數字僅為「顯示寬度」,不限制存儲範圍、不影響磁盤佔用,只有配合 ZEROFILL 才有零填充效果。

一、核心結論

二、實戰驗證

1. 無 ZEROFILL:完全等價

CREATE TABLE t1 (c INT);
CREATE TABLE t2 (c INT(3));
CREATE TABLE t3 (c INT(11));

INSERT INTO t1 VALUES (10), (2147483647);
INSERT INTO t2 VALUES (10), (2147483647);
INSERT INTO t3 VALUES (10), (2147483647);

SELECT * FROM t1;  -- 10, 2147483647
SELECT * FROM t2;  -- 10, 2147483647
SELECT * FROM t3;  -- 10, 2147483647

2. 加 ZEROFILL:零填充演示

CREATE TABLE t_zf3 (c INT(3) ZEROFILL);
CREATE TABLE t_zf11 (c INT(11) ZEROFILL);

INSERT INTO t_zf3 VALUES (1), (10), (100), (1000);
INSERT INTO t_zf11 VALUES (1), (10), (100), (1000);

SELECT * FROM t_zf3;
+------+
| c    |
+------+
| 001  |
| 010  |
| 100  |
| 1000 |  -- 超過寬度不截斷
+------+

SELECT * FROM t_zf11;
+------------+
| c          |
+------------+
| 0000000001 |
| 0000000010 |
| 0000000100 |
| 0000001000 |
+------------+

關鍵現象:ZEROFILL 隱含 UNSIGNED,超過顯示寬度的數字不會截斷,原樣輸出。

三、MySQL 整數類型完整對照

定義存儲字節有符號範圍無符號範圍顯示寬度作用
INT / INT(11)4 bytes-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295默認 11,僅影響 ZEROFILL 填充位數
INT(3)4 bytes同上同上默認 3,同樣只影響 ZEROFILL
類型字節默認顯示寬度有符號範圍無符號範圍
TINYINT14-128 ~ 1270 ~ 255
SMALLINT26-32,768 ~ 32,7670 ~ 65,535
MEDIUMINT39-8,388,608 ~ 8,388,6070 ~ 16,777,215
INT / INTEGER411-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295
BIGINT820-9.22e18 ~ 9.22e180 ~ 1.84e19

四、常見誤區澄清

  1. 誤區:int(3) 存不下 1000。事實:存得下,顯示寬度 3 不限制值域。
  2. 誤區:int(11) 比 int(3) 佔用更多空間。事實:均佔 4 字節。
  3. 誤區:顯示寬度影響索引性能。事實:零影響,索引存儲的是二進制值。
  4. 誤區:ZEROFILL 是業務邏輯必需。事實:純屬顯示層面,應用層格式化更靈活,建議不使用。

五、最佳實踐建議

  • 定義簡潔:直接用 INT、BIGINT,省去無意義的顯示寬度。
  • 非負業務:加 UNSIGNED 獲得雙倍正數範圍(如用戶 ID、商品 ID)。
  • 零填充需求:應用層用 String.format("%011d", id) 或 LPAD(id, 11, '0') 處理,勿依賴數據庫顯示屬性。
  • 遷移兼容:歷史表已有 INT(11) 可保持不變,新表統一簡寫。

六、總結

INT(M) 中的 M 只是「顯示寬度提示」,不限制存儲範圍、不改變佔用字節、不影響性能。唯一可見行為差異是配合 ZEROFILL 時的左側零填充。現代開發規範建議:拋棄顯示寬度,直接使用類型名;零填充交給應用層;非負字段加 UNSIGNED。

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