整數類型是資料庫設計中最基礎、使用最頻繁的資料類型。正確選型不僅關乎儲存空間效率,更直接影響索引效能、網路傳輸與應用層數據映射。本文提供 MySQL 五大整數類型的完整規格對比、儲存機制解析與實戰選型決策樹。
| 類型 | 儲存字節 | 有符號範圍 | 無符號範圍 | 典型應用場景 |
|---|---|---|---|---|
TINYINT | 1 Byte | -128 ~ 127 | 0 ~ 255 | 布爾標誌、狀態碼、極小計數器、性別(0/1/2) |
SMALLINT | 2 Bytes | -32,768 ~ 32,767 | 0 ~ 65,535 | 郵遞區號、年齡、小型字典表 ID、權限位掩碼 |
MEDIUMINT | 3 Bytes | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等規模業務 ID、RGB 顏色值(0xFFFFFF)、IPv4 整數存儲 |
INT / INTEGER | 4 Bytes | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 通用主鍵 ID、外鍵、計數器、時間戳(秒) |
BIGINT | 8 Bytes | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 | 分布式 ID (Snowflake)、大流量日誌序號、精確金融分賬 |
INT(N) 的誤區INT(11)、BIGINT(20) 中的數字**僅為顯示寬度提示**,**完全不影響儲存範圍、索引大小或運算精度**UNSIGNED 的雙刃劍| 優勢 | 風險 | ||
|---|---|---|---|
| 正數範圍翻倍 (INT: 21億 → 42億) | 減法運算結果為負數時會報錯或產生巨大正數 (下溢) | ||
| 語義明確:ID、計數器天然非負 | 應用層語言 (Java 無無符號類型) 映射麻煩,需用長整型或 BigInteger | ||
| 索引統計資訊更精確 | 與有符號欄位 JOIN/比較時發生隱式轉換,導致索引失效 |
| 類型 | 字節 | 精度/範圍 | 適用場景 |
|---|---|---|---|
FLOAT | 4 | ~7 位有效數字,±3.4E38 | 科學計算、非精確測量、坐標 |
DOUBLE | 8 | ~15 位有效數字,±1.7E308 | 高精度科學計算 |
DECIMAL(M,D) | M+2 字節 (壓縮) | 精確十進制,M≤65, D≤30 | 金融金額、價格、匯率、比率 (唯一正解) |
鐵律:**任何涉及金錢、精確比率的場景,嚴禁使用 FLOAT/DOUBLE,強制 DECIMAL(19,4) 或更高精度**。
INT,2-42 億用 BIGINT,> 42 億用 BIGINT UNSIGNED + 應用層適配TINYINT UNSIGNEDSMALLINT UNSIGNEDMEDIUMINT UNSIGNEDINT UNSIGNEDDECIMAL(精度,標度),整數部分預留足夠位數| 反模式 | 問題 | 修正 |
|---|---|---|
所有 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 增加INT 主鍵能緩存 2 倍行數BIGINT 明顯增加帶寬整數類型選型是資料庫設計的基石功夫。**「剛好夠用、語義清晰、類型一致」**是核心原則。建立團隊類型選型規範表,納入評審清單,從源頭避免因類型不當導致的擴容重構、效能退化與資料錯誤。