VARCHAR 實際數據存儲在聚簇索引外,長度前綴 1-2 字節(≤255 用 1 字節,>255 用 2 字節)。故單列理論上限 65535 字節。
| 字符集 | 單字符最大字節 | VARCHAR 最大字符數 |
|---|---|---|
| latin1 | 1 | 65533(不允許 NULL)/ 65532(允許 NULL) |
| gbk | 2 | 32766 / 32765 |
| utf8 | 3 | 21845 / 21844 |
| utf8mb4 | 4 | 16383 / 16382 |
一行所有定長列 + 變長列長度前綴 + NULL 位圖 ≤ 65535。
-- 單列 VARCHAR(N) CHARSET=gbk,不允許 NULL
N_max = (65535 - 1 - 2) / 2 = 32766
-- -1: 行數據從第 2 字節開始
-- -2: 長度前綴 2 字節
-- /2: gbk 雙字節
-- 多列:INT + CHAR(30) + VARCHAR(N) CHARSET=utf8
N_max = (65535 - 1 - 2 - 4 - 30*3) / 3 = 21812
-- -4: INT 4 字節
-- -90: CHAR(30) utf8 佔 90 字節
超過上述任一限制,MySQL **自動轉為 TEXT 類型**並拋 Warning。TEXT 列固定 11 字節指針,不再計入行長度,但失去 VARCHAR 的索引前綴優勢。
| 類型 | 長度 | 存儲 | 效能 | 適用場景 |
|---|---|---|---|---|
| CHAR(M) | 0-255 固定 | 右填充空格,定長 | 索引極快,更新無碎片 | 定長代碼、MD5、UUID、國標代碼 |
| VARCHAR(M) | 0-65535 變長 | 實際長度+1/2字節前綴 | 空間省、索引稍慢 | 不定長文本、名稱、描述 |
| TEXT | 0-64KB | 溢出頁,11字節指針 | 最慢,無法全長索引 | 大文本、文章內容、日誌 |
OPTIMIZE TABLE