MySQL 數值類型完整對照與選型指南
選對數值類型 = 節省空間 + 提升性能 + 避免溢出。本文提供全類型存儲字節、有符號/無符號範圍、精度特性、選型決策表。
整數類型 (精確數值)
| 類型 | 存儲 (字節) | 有符號範圍 | 無符號範圍 | 典型用途 |
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 布爾標誌 (0/1)、極小枚舉、狀態碼 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 年齡、短整數計數、郵編 |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等計數、RGB 顏色值 (0xFFFFFF) |
| INT / INTEGER | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 通用整數首選、自增主鍵 (中小表) |
| BIGINT | 8 | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 大數據量自增主鍵、時間戳毫秒、雪花 ID |
顯示寬度:INT(11) 中的 11 僅影響 ZEROFILL 時的顯示寬度,**不限制存儲範圍**。8.0 已棄用顯示寬度語法。
定點數類型 (精確小數,金融/價格必用)
| 類型 | 語法 | 存儲 | 精度範圍 | 說明 |
| DECIMAL / NUMERIC | DECIMAL(M,D) | ≈ M/2 字節 (每 4 位數字 2 字節) + 小數點/符號 | M 最大 65,D 最大 30 | 精確計算,字符串存儲,無浮點誤差 |
M = 總位數 (精度),D = 小數位數 (標度)。
- 價格/金額推薦:
DECIMAL(19,4) (支持萬億級、4 位小數) 或 DECIMAL(10,2) (億級、分)。
- 避免用 FLOAT/DOUBLE 存金額:
0.1 + 0.2 != 0.3。
浮點數類型 (近似數值,科學計算/坐標/指標)
| 類型 | 存儲 | 範圍 (近似) | 精度 | 說明 |
| FLOAT | 4 字節 | ±1.17e-38 ~ ±3.40e38 | ~7 位有效數字 | 單精度,IEEE 754 |
| DOUBLE / DOUBLE PRECISION / REAL | 8 字節 | ±2.22e-308 ~ ±1.80e308 | ~15-16 位有效數字 | 雙精度,默認 REAL=DOUBLE |
| FLOAT(p) | 4/8 字節 | p≤24 用 FLOAT,p≥25 用 DOUBLE | p 為二進制精度位 | 非標準語法,慎用 |
- 經緯度坐標推薦
DECIMAL(10,7) (米級) 或 DOUBLE (高精度計算)。
- 科學計算、機器學習特徵值用 DOUBLE。
選型決策表
| 業務場景 | 推薦類型 | 理由 |
| 自增主鍵 (千萬級以下) | INT UNSIGNED / BIGINT UNSIGNED | 4/8 字節,正數翻倍範圍 |
| 自增主鍵 (億級/分表) | BIGINT UNSIGNED | 避免耗盡 |
| 狀態/類型/性別 (枚舉) | TINYINT UNSIGNED | 1 字節,配合 CHECK/ENUM 约束 |
| 用戶年齡、庫存數量 | SMALLINT / MEDIUMINT UNSIGNED | 足夠範圍,節省空間 |
| 商品價格、訂單金額、帳戶餘額 | DECIMAL(19,4) / DECIMAL(10,2) | 精確無誤差 |
| 經緯度 (地圖應用) | DECIMAL(10,7) / DOUBLE | 精度/計算平衡 |
| 溫度、傳感器讀數、評分 | FLOAT / DOUBLE | 近似計算可接受 |
| Unix 時間戳 (秒) | INT UNSIGNED | 4 字節,2106 年溢出 (注意) |
| 毫秒/微秒時間戳 | BIGINT UNSIGNED | 8 字節,長期可用 |
常見屬性與陷阱
- UNSIGNED
- 無符號,範圍翻倍,禁止負數。自增主鍵、計數器、ID 類強烈建議加 UNSIGNED。
- ZEROFILL
- 自動補 0 顯示 (如
INT(5) ZEROFILL 插入 7 顯示 00007)、**隱含 UNSIGNED**。8.0 棄用,應用層格式化。
- AUTO_INCREMENT
- 僅整數類型,配合主鍵/唯一鍵。插入 NULL/0 觸發自增。
- 溢出行為
- 整數溢出報錯 (Out of range);浮點數溢出變 ±INF;DECIMAL 截斷四捨五入 (按 D)。
查看類型信息
SHOW COLUMNS FROM `table_name`;
-- 或
SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, NUMERIC_PRECISION, NUMERIC_SCALE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='db' AND TABLE_NAME='table';