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

MySQL 資料庫表設計與優化(二):數值類型深度解析、整數族系選型指南與儲存計算特性

     編輯:MySQL 資料庫相關知識

數值類型選型的兩階段決策

確定資料類型的第一步是分類:數值型、字串型、時間型、空間型、JSON 型。第二步是在同類型中選擇具體子類型,依據:儲存範圍、精度要求、空間效率、特殊行為屬性。MySQL 為相容性提供別名(如 INTEGER=INT、BOOL=TINYINT(1)),不影響效能但易混淆,建議統一使用標準名稱。

整數族系完整對照表

類型位元數有號範圍無號範圍儲存位元組典型應用場景
TINYINT 8 -128 ~ 127 0 ~ 255 1 布林旗標、狀態碼、小範圍枚舉、年齡
SMALLINT 16 -32,768 ~ 32,767 0 ~ 65,535 2 郵遞區號、小型 ID、年份、百分比(0~10000)
MEDIUMINT 24 -8,388,608 ~ 8,388,607 0 ~ 16,777,215 3 中等規模 ID、RGB 色彩值(0~16777215)、計數器
INT / INTEGER 32 -2,147,483,648 ~ 2,147,483,647 0 ~ 4,294,967,295 4 通用主鍵、外鍵、大多數計數器、時間戳
BIGINT 64 -9.22e18 ~ 9.22e18 0 ~ 1.84e19 8 超大 ID(分散式 ID)、毫秒時間戳、精確金額(分為單位)

關鍵特性深度解析

UNSIGNED 無號屬性

  • 無號不佔額外空間,效能相同
  • 將正數上限提升約 2 倍(如 TINYINT UNSIGNED 0~255 vs -128~127)
  • 適用:ID、計數器、長度、時間戳等絕不為負的業務欄位
  • 避坑:-1 插入無號欄位會變為最大值(模 2^N),應用層需嚴格驗證

顯示寬度 (M) 的真相

  • INT(11)、INT(1)、INT(20) 儲存與計算完全相同
  • M 僅影響交互式工具顯示寬度(如命令列客戶端),配合 ZEROFILL 時左側補零
  • 不限制插入值範圍,INT(3) 可存 1000000
  • 建議:忽略顯示寬度,統一寫 INT、BIGINT 等標準形式

整數運算內部機制

  • MySQL 內部整數運算統一以 64 位有號 BIGINT 執行(即使 32 位系統)
  • 例外:部分聚合函數(SUM、AVG)使用 DECIMAL 或 DOUBLE 避免溢位
  • 除法 / 回傳 DOUBLE,整除 DIV 回傳整數

ZEROFILL 隱含 UNSIGNED

  • INT(5) ZEROFILL → 自動加 UNSIGNED,插入 123 顯示為 00123
  • 僅影響顯示,不影響儲存值
  • 應用層格式化更靈活,資料庫層建議不使用

儲存引擎差異影響

引擎整數儲存特性注意事項
InnoDB 標準儲存,主鍵聚簇索引按整數序排列 自增主鍵連續插入效能最佳
MyISAM 標準儲存,支援壓縮表 無交易支援,已淘汰
Memory (HEAP) 記憶體中定長儲存,VARCHAR 變為 CHAR 重啟資料消失,僅適合暫存
Falcon 自有格式,使用者無法控制大小/壓縮 已停止開發
ColumnStore / ClickHouse 列式壓縮編碼(Run-length, Delta, Dictionary 等) 整數壓縮極佳,類型選擇影響壓縮率

選型實戰決策指南

  1. 主鍵/外鍵:預設 BIGINT UNSIGNED AUTO_INCREMENT(分散式系統)或 INT UNSIGNED AUTO_INCREMENT(單體/小規模)
  2. 狀態/類型/枚舉:TINYINT UNSIGNED + 應用層常數映射(const STATUS_ACTIVE = 1)
  3. 計數器/統計:INT UNSIGNED 或 BIGINT UNSIGNED(視峰值)
  4. 時間戳:INT UNSIGNED 存 Unix 時間戳(秒),或 BIGINT UNSIGNED 存毫秒戳
  5. 金額/價格:嚴禁 FLOAT/DOUBLE。用 DECIMAL(10,2)(元,分)或 BIGINT(分/厘為單位整數)
  6. 百分比/比率:SMALLINT UNSIGNED 存萬分位 (0~10000) 或 DECIMAL(5,4)

常見陷阱與修正

整數類型看似簡單,實則暗藏儲存效率、計算正確性、索引效能、遷移相容性等多重考量。建立標準化類型選型規範,納入代碼審查清單,能從源頭消除大量隱性 Bug 與效能隱患。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤做法後果正確做法
金額用 FLOAT(10,2) 0.1 + 0.2 ≠ 0.3,對帳永遠差分 DECIMAL(10,2) 或 BIGINT 存分
自增 ID 用 SMALLINT 超過 65535 立即報錯,業務中斷 預估 10 年增長量,最小用 INT
INT(4) 以為限制 4 位數 插入 12345 成功,邏輯錯誤 應用層驗證或 CHECK 約束 (8.0.16+)
無號欄位插入負數 變為巨大正數,查詢結果荒謬 應用層嚴格檢查,資料庫層 CHECK (col >= 0)