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

MySQL 整數類型顯示寬度與取值範圍深度解析:M 值、ZEROFILL 與符號位的真相

     編輯:MySQL 資料庫相關知識

MySQL 整數類型定義中的 INT(M)、SMALLINT(M) 等,M 僅為顯示寬度,不影響儲存範圍。本文通過實測驗證預設寬度、ZEROFILL 效果、越界截斷行為與符號位對範圍的決定性影響。

預設顯示寬度驗證

CREATE TABLE c (id INT NOT NULL, name CHAR NOT NULL);
DESC c;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | NULL    |       |
| name  | char(1) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

修改類型觀察預設寬度變化:

類型預設顯示寬度儲存字節有符號範圍無符號範圍
TINYINT41-128 ~ 1270 ~ 255
SMALLINT62-32768 ~ 327670 ~ 65535
MEDIUMINT93-8388608 ~ 83886070 ~ 16777215
INT114-2147483648 ~ 21474836470 ~ 4294967295
BIGINT208-9223372036854775808 ~ 92233720368547758070 ~ 18446744073709551615

ZEROFILL:顯示寬度的唯一實戰場景

CREATE TABLE t (id INT(5) ZEROFILL);
INSERT INTO t VALUES (1), (12), (123), (1234), (12345);
SELECT * FROM t;
+-------+
| id    |
+-------+
| 00001 |
| 00012 |
| 00123 |
| 01234 |
| 12345 |
+-------+

ZEROFILL 隱含 UNSIGNED,負數插入會報錯或截斷為 0。

越界插入實測:截斷與警告

CREATE TABLE c (id TINYINT, name CHAR(1));
INSERT INTO c VALUES (300, 'chen');
-- Warning: Out of range value for column 'id' at row 1
-- Warning: Data truncated for column 'name' at row 1

SELECT * FROM c;
+------+------+
| id   | name |
+------+------+
|  127 | c    |  -- TINYINT 有符號最大值 127
+------+------+

再次插入 320,結果同樣為 127。
結論:嚴格模式 (STRICT_ALL_TABLES) 下會直接報錯回滾;非嚴格模式下截斷至邊界值並發出 Warning。

符號位是範圍的分水嶺

實測中 TINYINT 最大只到 127,原因是預設為 SIGNED(有符號),最高位作為符號位。
若需 0~255 範圍,必須顯式聲明:

CREATE TABLE t (id TINYINT UNSIGNED);  -- 範圍 0 ~ 255

避坑清單

  1. 不要假設 INT(4) 只能存 4 位數字——可存 10 位,M 只影響 ZEROFILL 顯示。
  2. 業務 ID、計數器優先用 UNSIGNED——擴大正向範圍、語義更清晰。
  3. 嚴格模式必開——sql_mode=STRICT_TRANS_TABLES,STRICT_ALL_TABLES,讓越界直接報錯而非靜默截斷。
  4. 大數據量場景評估 BIGINT vs INT——4 字節 vs 8 字節,索引體積差一倍。

理解顯示寬度與儲存範圍的解耦關係,是設計高效、正確表結構的基礎功。

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