正確選擇數據類型是性能與存儲效率的基石。本文系統講解浮點/定點數、字符串(VARCHAR/CHAR/BINARY)、大對象(BLOB/TEXT)、枚舉、日期時間(DATETIME/TIMESTAMP)、位類型的存儲特性、適用場景、避坑指南及優化技巧。
DECIMAL(18,9) 佔 9 字節。精確計算首選(財務金額),但計算開銷大。BIGINT 替代 DECIMAL,金額乘 10n 存整數(如萬分之一分乘 1000000),兼得精確與性能。| 類型 | 特點 | 適用場景 |
|---|---|---|
| VARCHAR | 變長,1-2 字節存長度,節省空間,UPDATE 可能產生碎片 | 長度差異大、較少更新、UTF-8 多字節字符集 |
| CHAR | 定長,自動填充/去除尾部空格,不易碎片 | 極短固定長度(MD5、Y/N 狀態)、頻繁更新列 |
| BINARY/VARBINARY | 存字節碼,填充 \0,按字節比較,區分大小寫、速度快 | 二進制數據、需字節級比較場景 |
避坑:VARCHAR(5) 和 VARCHAR(200) 存 'hello' 磁盤空間相同,但內存臨表排序時會按定長分配,盡量定義最小足夠長度。
max_sort_length 字節,不可全長度索引,不可用索引消除排序。.frm 存映射表。ALTER TABLE,不適合頻繁變動集合。| 類型 | 範圍 | 存儲 | 時區 | 特殊屬性 |
|---|---|---|---|---|
| DATETIME | 1001-9999 年 | 8 字節 | 無關 | 無 |
| TIMESTAMP | 1970-2038 年 | 4 字節 | 相關(顯示受時區影響) | 默認 NOT NULL,首列默認 CURRENT_TIMESTAMP,更新自動刷新 |
建議:優先用 TIMESTAMP(空間效率高、自動時間戳),跨時區業務用 DATETIME。微秒級需求可用 BIGINT 存微秒時間戳或 DOUBLE 存秒+小數,或改用 MariaDB。
b'00111001' 顯示 ASCII 57 即 '9'),數字上下文自動轉數字(57)。CHAR(0) 可存 NULL/空字符串表示 True/False。