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

MySQL 整數類型完整對比:TINYINT 到 BIGINT 範圍、儲存與選型指南

     編輯:MySQL 綜合教學

MySQL 整數類型完整對比:TINYINT 到 BIGINT 範圍、儲存與選型指南

整數類型是資料庫設計中最基礎、使用最頻繁的資料類型。正確選型不僅關乎儲存空間效率,更直接影響索引效能、網路傳輸與應用層數據映射。本文提供 MySQL 五大整數類型的完整規格對比、儲存機制解析與實戰選型決策樹。

一、五大整數類型核心規格對比表

類型儲存字節有符號範圍無符號範圍典型應用場景
TINYINT1 Byte-128 ~ 1270 ~ 255布爾標誌、狀態碼、極小計數器、性別(0/1/2)
SMALLINT2 Bytes-32,768 ~ 32,7670 ~ 65,535郵遞區號、年齡、小型字典表 ID、權限位掩碼
MEDIUMINT3 Bytes-8,388,608 ~ 8,388,6070 ~ 16,777,215中等規模業務 ID、RGB 顏色值(0xFFFFFF)、IPv4 整數存儲
INT / INTEGER4 Bytes-2,147,483,648 ~ 2,147,483,6470 ~ 4,294,967,295通用主鍵 ID、外鍵、計數器、時間戳(秒)
BIGINT8 Bytes-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,8070 ~ 18,446,744,073,709,551,615分布式 ID (Snowflake)、大流量日誌序號、精確金融分賬

二、關鍵技術細節深度解析

1. 顯示寬度 INT(N) 的誤區

  • INT(11)、BIGINT(20) 中的數字**僅為顯示寬度提示**,**完全不影響儲存範圍、索引大小或運算精度**
  • 應用層 ORM (如 Hibernate、MyBatis) 可能根據此寬度生成字段長度驗證,**建議遷移至應用層驗證,資料庫層不指定寬度**
  • MySQL 8.0.17 起已棄用顯示寬度語法,未來版本將移除

2. 無符號 UNSIGNED 的雙刃劍

建議:主鍵 ID 僅在確定超過 21 億且應用層能妥善處理時才用 BIGINT UNSIGNED,否則優先 BIGINT (有符號)。

3. 運算溢位與類型提升規則

  • 所有算術運算 (+、-、*) **內部以有符號 BIGINT 或 DOUBLE 進行**
  • 兩個 INT 相乘若結果 > 21 億,**會自動提升為 BIGINT 運算**,但最終若插入 INT 欄位會截斷/報錯
  • 位運算 (&、|、^, ~) **以 64 位無符號 BIGINT 進行**

三、浮點與定點類型補充對比

優勢風險
正數範圍翻倍 (INT: 21億 → 42億)減法運算結果為負數時會報錯或產生巨大正數 (下溢)
語義明確:ID、計數器天然非負應用層語言 (Java 無無符號類型) 映射麻煩,需用長整型或 BigInteger
索引統計資訊更精確與有符號欄位 JOIN/比較時發生隱式轉換,導致索引失效
類型字節精度/範圍適用場景
FLOAT4~7 位有效數字,±3.4E38科學計算、非精確測量、坐標
DOUBLE8~15 位有效數字,±1.7E308高精度科學計算
DECIMAL(M,D)M+2 字節 (壓縮)精確十進制,M≤65, D≤30金融金額、價格、匯率、比率 (唯一正解)

鐵律:**任何涉及金錢、精確比率的場景,嚴禁使用 FLOAT/DOUBLE,強制 DECIMAL(19,4) 或更高精度**。

四、實戰選型決策樹

  1. 是否為主鍵/外鍵?
    • 是 → 評估未來 5-10 年數據量:< 2 億用 INT,2-42 億用 BIGINT,> 42 億用 BIGINT UNSIGNED + 應用層適配
    • 否 → 進入第 2 步
  2. 業務語義範圍?
    • 0/1 狀態、性別、少量枚舉 → TINYINT UNSIGNED
    • 年齡、百分比、小字典 → SMALLINT UNSIGNED
    • 中等計數、顏色值、IPv4 → MEDIUMINT UNSIGNED
    • 通用計數、時間戳秒 → INT UNSIGNED
  3. 是否參與 JOIN/比較?
    • 是 → **雙方類型、符號位、字符集必須 100% 一致**,否則索引失效
  4. 是否涉及金額/精確計算?
    • 是 → DECIMAL(精度,標度),整數部分預留足夠位數

五、常見反模式與修正

反模式問題修正
所有 ID 統一用 BIGINT空間浪費 2 倍、索引深度增加、緩存命中率下降按決策樹選型,小表用 INT/SMALLINT
狀態欄位用 VARCHAR(20) 存 'active'/'inactive'空間 20 倍、比較慢、易拼寫錯TINYINT UNSIGNED + 應用層 Enum 映射
金額用 DOUBLE 或 FLOAT浮點誤差導致對賬失敗、法律風險DECIMAL(19,4) (支援萬億級、4 位小數)
INT(10) 認為限制 10 位數誤導開發,實際仍可存 11 位移除顯示寬度,應用層驗證

六、效能影響量化

  • 儲存空間:BIGINT 索引比 INT 大 100%,B+ 樹層高可能增加 1 層,隨機 I/O 增加
  • 緩存效率:InnoDB Buffer Pool 同等內存下,INT 主鍵能緩存 2 倍行數
  • 網路傳輸:結果集傳輸量按字節計算,大表查詢 BIGINT 明顯增加帶寬
  • CPU 運算:64 位運算在 32 位系統 (極少見) 较慢,現代 64 位 CPU 無差異

整數類型選型是資料庫設計的基石功夫。**「剛好夠用、語義清晰、類型一致」**是核心原則。建立團隊類型選型規範表,納入評審清單,從源頭避免因類型不當導致的擴容重構、效能退化與資料錯誤。

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