前言
掌握各數據類型的存儲開銷,是表設計、容量規劃、效能優化的基礎。本文整理 MySQL 官方文檔,按類別匯總各類型存儲字節數,並附帶選型建議。
一、數值類型
| 類型 | 存儲字節 | 範圍/說明 |
| TINYINT | 1 | -128~127 / 0~255 (UNSIGNED) |
| SMALLINT | 2 | -32768~32767 |
| MEDIUMINT | 3 | -8388608~8388607 |
| INT / INTEGER | 4 | -2147483648~2147483647 |
| BIGINT | 8 | ±9.22e18 |
| FLOAT(p) | 4 (p≤24) / 8 (25≤p≤53) | 單精度/雙精度自動轉換 |
| FLOAT | 4 | 單精度 |
| DOUBLE / DOUBLE PRECISION / REAL | 8 | 雙精度 |
| DECIMAL(M,D) / NUMERIC(M,D) | M+2 (M>D) / D+2 (M≤D) | 精確定點數,每 9 位數字佔 4 字節 |
| BIT(M) | ≈ (M+7)/8 | 位字段 |
二、日期時間類型
| 類型 | 存儲字節 | 範圍/精度 |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 |
| TIME | 3 | -838:59:59 ~ 838:59:59 |
| YEAR | 1 | 1901 ~ 2155 |
| DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59(秒精度) |
| TIMESTAMP | 4 | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC(時區感知) |
| DATETIME(6) / TIMESTAMP(6) | 8 / 7 | 微秒精度(5.6.4+) |
三、字符串類型
| 類型 | 存儲字節 | 最大長度/說明 |
| CHAR(M) | M | 0~255 字符,固定長度,右側填充空格 |
| VARCHAR(M) | L+1 (M≤255) / L+2 (M>255) | 變長,L 為實際字符字節長度 |
| TINYBLOB / TINYTEXT | L+1 | < 256 字節 |
| BLOB / TEXT | L+2 | < 64 KB |
| MEDIUMBLOB / MEDIUMTEXT | L+3 | < 16 MB |
| LONGBLOB / LONGTEXT | L+4 | < 4 GB |
| ENUM('v1','v2',...) | 1 或 2 | 取決於枚舉值數量(≤255 用 1 字節,≤65535 用 2 字節) |
| SET('v1','v2',...) | 1~8 | 取決於成員數量(最多 64 個成員) |
四、選型黃金法則
- 越小越好:滿足業務前提下選最小類型(如狀態碼用 TINYINT UNSIGNED)。
- 定長優於變長:長度固定且頻繁更新的欄位(如 MD5、UUID)用 CHAR。
- 避免 BLOB/TEXT:非必要不存大文本,拆分到獨立表或對象存儲。
- 金額用 DECIMAL:
DECIMAL(19,4) 滿足多數貨幣場景。
- 時間戳首選 TIMESTAMP:自帶時區轉換、佔 4 字節;需跨 2038 年用 DATETIME。
- 枚舉/集合慎用:修改結構需 ALTER TABLE 鎖表,擴展性差,建議改用查找表。
五、獲取實際表大小的 SQL
SELECT
TABLE_NAME,
ROUND(DATA_LENGTH/1024/1024,2) AS data_mb,
ROUND(INDEX_LENGTH/1024/1024,2) AS index_mb,
TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_db'
ORDER BY DATA_LENGTH DESC;
六、總結
本表為 MySQL 8.0 通用規範,具體版本、存儲引擎(InnoDB/MyISAM)、行格式(Compact/Dynamic/Compressed)可能略有差異。設計時請以「業務範圍 + 存儲開銷 + 索引效能」三維權衡,並用實際數據驗證。