| MySQL 版本 | VARCHAR 最大長度 | 備註 |
|---|---|---|
| 5.0.3 之前 | 255 | 超過需用 TEXT/BLOB |
| 5.0.3 及以上 | 65,535 | 實際可存 65,532 位元組(扣除長度前綴) |
| 字符集 | 單字符最大位元組 | VARCHAR 最大字符數 (65,532 / 單字符位元組) |
|---|---|---|
| latin1 | 1 | 65,532 |
| gbk | 2 | 32,766 |
| utf8 | 3 | 21,844 |
| utf8mb4 | 4 | 16,383 |
超過此限制會自動轉為 TEXT 型別並產生 Warning。
錯誤訊息:ERROR 1118 (42000): Row size too large...
CREATE TABLE t4 (c VARCHAR(N)) CHARSET=gbk;
-- N_max = (65535 - 1 - 2) / 2 = 32,766
-- 扣除:行起始1位元組 + 長度前綴2位元組,除以gbk雙字節
CREATE TABLE t4 (
c1 INT,
c2 CHAR(30),
c3 VARCHAR(N)
) CHARSET=utf8;
-- 固定開銷計算:
-- 行起始: 1
-- VARCHAR長度前綴: 2
-- c1 INT: 4 位元組
-- c2 CHAR(30): 30 × 3 = 90 位元組 (utf8固定長)
-- 可用餘額: 65535 - 1 - 2 - 4 - 90 = 65,438 位元組
-- N_max = 65,438 / 3 = 21,812 字符
SELECT MAX(LENGTH(col)) FROM tbl; 定期檢查實際佔用✅ 事實:UTF-8 下最多 21,844 字符;且受單行總長限制,其他欄位會佔用額度。
✅ 事實:短資料(< 40 位元組)可能內聯在聚簇索引頁面;長資料溢位到外部頁面,行中保留 20 位元組指標。