一、數值類型三大類
1. 定點數:DECIMAL / NUMERIC(同義)
- 存儲方式:字符串形式,每位數字(含小數點)佔 1 字節
- 優勢:精度固定,運算不「失真」
- 適用:價格、金額、財務數據——準確度 > 空間/性能
- 代價:空間佔用大,計算較慢
2. 浮點數:FLOAT (4B) / DOUBLE (8B)
- 優勢:表示極小絕對值 (FLOAT ~1.17E-38, DOUBLE ~2.22E-308)
- 適用:科學計算、工程測量等高精度科學場景
- 民用系統幾乎不用:作者從未遇到合適場景
3. 整數類型:核心選型戰場
| 類型 | 字節 | 無符號最大值 | 典型適用場景 |
| TINYINT | 1 | 255 | 年齡、狀態碼、布爾標誌、極小計數 |
| SMALLINT | 2 | 65,535 | 遊戲技能值、中等計數、郵編(數字) |
| MEDIUMINT | 3 | 16,777,215 | 千萬級表自增 ID 首選,省 1B/行 |
| INT | 4 | 4,294,967,295 | 通用 ID、大計數、IPv4 整數存儲 |
| BIGINT | 8 | 18,446,744,073,709,551,615 | 極大計數、分布式 ID (Snowflake)、時間戳毫秒 |
原則:「夠用且最小」。1600 萬行表用 MEDIUMINT 代替 INT 節省 10MB+ 空間及緩存壓力。
二、日期時間類型
| 類型 | 字節 | 範圍 | 適用 |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 純日期(生日、入職) |
| TIME | 3 | -838:59:59 ~ 838:59:59 | 純時間(鬧鐘、時長) |
| DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 最常用:創建/更新時間、業務時間點 |
| TIMESTAMP | 4 | 1970-01-01 ~ 2038-01-19 (UTC) | 自動更新列、跨時區應用、版本控制 |
| YEAR | 1 | 1901 ~ 2155 | 年份唯一場景 |
關鍵差異:TIMESTAMP 存儲 UTC、讀取轉換會話時區,DATETIME 時區無關。2038 年問題限制 TIMESTAMP 長期使用。
三、字符串類型
| 類型 | 長度特性 | 空間計算 | 選型判斷 |
| CHAR(N) | 固定長度 | N 字節 | 值長度固定/極接近固定(MD5、UUID、郵編、股票代碼) |
| VARCHAR(N) | 可變長度 | 實際長度 + 1-2 字節 | 長度變化大,最大值可預估(用戶名、標題、URL) |
| TINYTEXT | ≤255 | L + 1 | 短文本 |
| TEXT | ≤65,535 | L + 2 | 文章正文、描述 |
| MEDIUMTEXT | ≤16,777,215 | L + 3 | 長文本 |
| LONGTEXT | ≤4,294,967,295 | L + 4 | 超長文本 |
實戰案例:股票表
- 名稱:絕大多數 4 字(8B) → CHAR(8)
- 代碼:滬市 6 位、深市 4 位,滬市佔多數 → CHAR(6) 優於 VARCHAR(6) (深市佔 5B+1=6B,滬市 6B+1=7B,加權平均更大)
四、枚舉與集合
| 類型 | 成員上限 | 選擇規則 | 空間 | 典型場景 |
| ENUM | 65,535 | 單選,必選其一 | 1-2 字節 | 性別、狀態、類別、省份 |
| SET | 64 | 多選,可空 | 1-8 字節 | 權限位圖、標籤、多屬性標記 |
亮點
- 底層存儲為整數(位圖),比較/排序/索引極快
- 應用層直接用字符串
'male'/'female' 讀寫,無需映射轉換
ENUM('帥哥','美眉') 1 字節完美替代 TINYINT + 應用層映射
建庫策略核心口訣
- 數值優先:能用數值別用字符串(ENUM/SET 本質是數值)
- 定長優先:長度固定用 CHAR,變長用 VARCHAR
- 最小充分:整型選最小夠用,避免 BIGINT 濫用
- 精度分離:金額用 DECIMAL,科學用 FLOAT/DOUBLE,不可混用
- 時區感知:跨時區用 TIMESTAMP,單時區用 DATETIME
- 文本分級:≤255 TINYTEXT,≤64K TEXT,更大 MEDIUM/LONGTEXT
- 枚舉代替查表:低基數固定集合優先 ENUM/SET
總結
數據類型選型是 Schema 設計的基石,直接決定存儲空間、索引大小、查詢速度、應用層代碼複雜度。請在建表前完成業務數據畫像分析,依據上述策略精準落型,事半功倍。