MySQL 字段類型存儲大小與默認長度完整速查表
精準掌握每種類型的存儲開銷,是表設計、容量規劃、性能優化的基礎。本文匯總數值、字串、日期、二進制、枚舉/集合全類型存儲計算公式與實際案例。
數值類型 (固定長度)
| 類型 | 存儲 (字節) | 備註 |
| TINYINT | 1 | |
| SMALLINT | 2 | |
| MEDIUMINT | 3 | |
| INT / INTEGER | 4 | |
| BIGINT | 8 | |
| FLOAT | 4 | 單精度 |
| DOUBLE / DOUBLE PRECISION / REAL | 8 | 雙精度 |
| DECIMAL(M,D) / NUMERIC(M,D) | ≈ (M+2)/2 字節 | 每 4 位數字 2 字節,整數/小數部分分別計算 |
| BIT(M) | ≈ (M+7)/8 字節 | |
日期時間類型 (固定長度,5.6.4+ 支持微秒)
| 類型 | 存儲 (字節) | 範圍 | 精度 |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 天 |
| TIME | 3 + (fsp>0?1:0) | -838:59:59 ~ 838:59:59 | 秒/微秒 |
| DATETIME | 5 + (fsp>0?1:0) | 1000-01-01 ~ 9999-12-31 | 秒/微秒 |
| TIMESTAMP | 4 + (fsp>0?1:0) | 1970-01-01 ~ 2038-01-19 | 秒/微秒 |
| YEAR | 1 | 1901 ~ 2155 | 年 |
fsp = fractional seconds precision (0-6),微秒精度每增加 1 位約需 1 字節 (實際按 4 位一組存儲)。
字串類型 (變長,含長度前綴)
| 類型 | 最大長度 | 存儲計算 | 長度前綴 | 適用場景 |
| CHAR(M) | 255 字符 | M × w 字節 (w=字符集最大字節數) | 無 (定長) | 固定長度代碼 (MD5、UUID、ISO 代碼) |
| VARCHAR(M) | 65,535 字符 (行限制) | L × w + 1/2 字節 | 1 字節 (L<256) / 2 字節 (L≥256) | 變長文本 (名稱、郵箱、地址) |
| TINYTEXT / TINYBLOB | 255 (2^8-1) | L + 1 字節 | 1 字節 | 極短文本/二進制 |
| TEXT / BLOB | 65,535 (2^16-1) | L + 2 字節 | 2 字節 | 短文本/圖片/文檔 |
| MEDIUMTEXT / MEDIUMBLOB | 16,777,215 (2^24-1) | L + 3 字節 | 3 字節 | 中等文本/二進制 |
| LONGTEXT / LONGBLOB | 4,294,967,295 (2^32-1) | L + 4 字節 | 4 字節 | 長文本/大文件 |
L = 實際存儲字符數/字節數,w = 字符集最大字節數 (utf8mb4=4, utf8=3, latin1=1)。
VARCHAR(255) 用 1 字節前綴,VARCHAR(256) 用 2 字節,**建議不超過 255** 除非必要。
CHAR 定長補空格存儲,VARCHAR 不補空格。**CHAR 適合極短固定長度 (如 CHAR(32) 存 MD5)**。
TEXT/BLOB 家族不支持 DEFAULT 值 (8.0 前),索引需指定前綴長度。
枚舉與集合 (內部存儲為整數)
| 類型 | 成員上限 | 存儲 (字節) | 說明 |
| ENUM('v1','v2',...) | 65,535 | 1 (≤255 個) / 2 (>255) | 內部映射為 1,2,3... 緊湊高效 |
| SET('v1','v2',...) | 64 | 1/2/3/4/8 (取決於成員數) | 位掩碼存儲,支持多選 |
ENUM 陷阱:數值上下文會返回索引數字而非字符串;ORDER BY enum_col 按索引序而非字母序;修改成員需 ALTER TABLE 重建表。
JSON 類型 (5.7+)
- 存儲:類似
LONGTEXT (L + 4 字節) + 解析後的二進制樹結構 (佔額外空間)。
- 優勢:文檔驗證、路徑索引 (
JSON_EXTRACT 虛擬列索引)、部分更新 (JSON_SET)。
行大小限制與實際存儲估算
- InnoDB 行數據 (不含 BLOB/TEXT 溢出頁) **最大約 8KB** (半頁 16KB/2)。
VARCHAR/TEXT/BLOB 超過 768 字節會移至溢出頁,主記錄只存 20 字節指針。
- 估算表大小:
行數 × (固定長度列總和 + 變長列平均長度 + 開銷 ~20-30B) × 1.2 (索引/碎片)。
快速查看表結構存儲信息
-- 查看欄位類型、長度、字符集
SHOW FULL COLUMNS FROM `table_name`;
-- 估算表大小 (MB)
SELECT
TABLE_NAME,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_mb,
ROUND(DATA_LENGTH / 1024 / 1024, 2) AS data_mb,
ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS idx_mb,
TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_name'
ORDER BY DATA_LENGTH DESC;