| MySQL 版本 | VARCHAR(N) 含義 | UTF8 中文存儲上限 |
|---|---|---|
| 4.0 及之前 | N 字節 | N/3 個字符(如 20/3=6 個) |
| 5.0+ | N 字符 | N 個字符(與字節無關) |
| 字符集 | 單字符最大字節 | VARCHAR 最大字符數 |
|---|---|---|
| latin1 | 1 | 65,532 |
| gbk | 2 | 32,766 |
| utf8 | 3 | 21,844 |
| utf8mb4 | 4 | 16,382 |
超過上限會自動轉為 TEXT 類型並產生 Warning。
單行所有定長字段 + 變長字段長度前綴 + NULL 位圖 + 指針 ≤ 65,535 字節。
最大 N = (65535 - 1 - 2) / 2 = 32,766
-- 解釋:-1 行起始偏移,-2 長度前綴(>255),/2 gbk雙字節
CREATE TABLE t (
c1 INT, -- 4 字節
c2 CHAR(30), -- 30 * 3 = 90 字節 (utf8)
c3 VARCHAR(N) -- 目標字段 utf8
) CHARSET=utf8;
最大 N = (65535 - 1 - 2 - 4 - 90) / 3 = 21,812
-- 扣除:行偏移1、長度前綴2、INT 4、CHAR(30) 90,除以 utf8 單字符3字節
ALTER TABLE ... MODIFY col VARCHAR(new_len) 手動改回SHOW TABLE STATUS 中 Avg_row_length 接近 60KB 即需預警-- 查看表行格式與平均長度
SHOW TABLE STATUS LIKE 't'\G
-- 查看字段定義長度
SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='db' AND TABLE_NAME='t';
理解三大限制與字符集字節差異,結合業務實際預估長度,可避免 90% VARCHAR 設計陷阱與隱性性能問題。