VARCHAR 實際內容存於聚簇索引外,長度前綴佔 1~2 字節(>255 用 2 字節),故理論上限 65,535 字節。
| 字符集 | 單字最大字節 | 最大字符數 |
|---|---|---|
| gbk | 2 | 32,766 |
| utf8 | 3 | 21,845 |
| utf8mb4 | 4 | 16,383 |
超過則強制轉為 TEXT 並產生 Warning。
MySQL 單行定義長度不能超過 65,535 字節(不含 BLOB/TEXT 溢出頁)。超過報錯:ERROR 1118 (42000): Row size too large。
CREATE TABLE t4 (c VARCHAR(N)) CHARSET=gbk;
最大 N = (65535 - 1 - 2) / 2 = 32,766
CREATE TABLE t4 (c INT, c2 CHAR(30), c3 VARCHAR(N)) CHARSET=utf8;
最大 N = (65535 - 1 - 2 - 4 - 30×3) / 3 = 21,812
若 VARCHAR 超編碼限制被轉為 TEXT,每列僅佔 11 字節(指針),不再計入行長度限制。
總結:設計表時務必按「行總長度」倒推 VARCHAR 上限,別只看單列定義。