單行上限 65,535 位元組(含所有欄位、長度前綴、NULL 標記)。
| 條件 | 最大位元組 | 換算字元數 (latin1/gbk/utf8mb4) |
|---|---|---|
| NOT NULL | 65,533 | 65,533 / 32,766 / 16,383 |
| DEFAULT NULL | 65,532 | 65,532 / 32,766 / 16,383 |
計算公式:65535 - 長度前綴(1~2) - NULL標記(0/1) - 其他固定長欄位。
CREATE TABLE `tv` ( `a` VARCHAR(100) DEFAULT NULL, `b` VARCHAR(100) DEFAULT NULL, `c` VARCHAR(100) DEFAULT NULL, `d` VARCHAR(100) DEFAULT NULL, `e` VARCHAR(100) DEFAULT NULL, `f` VARCHAR(100) DEFAULT NULL, `g` VARCHAR(100) DEFAULT NULL, `h` VARCHAR(100) DEFAULT NULL, `i` VARCHAR(N) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- N 最大 = 64723 (位元組) = 64723 字元 (latin1)
| File Format / Row Format | VARCHAR 儲存方式 |
|---|---|
| Antelope (Redundant/Compact) | 聚簇索引僅存**前 768 位元組**,超出部分存 **Overflow Page**,索引存 20 位元組指針。最多 10 個此類大欄位。 |
| Barracuda (Dynamic/Compressed) | **全量溢出判斷**:若行長度超過頁面 1/2,優先將最長 VARCHAR 完整移至 Overflow Page,索引僅存 20 位元組指針。支援更多大欄位。 |
啟用 Barracuda:
SET GLOBAL innodb_file_format = Barracuda; SET GLOBAL innodb_file_per_table = ON; CREATE TABLE t (c VARCHAR(10000)) ROW_FORMAT=DYNAMIC;
myisampack)。| 字元集 | 單字元位元組 | VARCHAR(65535) 理論上限 |
|---|---|---|
| latin1 | 1 | 65,532 字元 |
| gbk | 2 | 32,766 字元 |
| utf8mb4 | 3~4 | 16,383 字元 |
TEXT/BLOB 或外部儲存。INDEX idx_name (col(20)),避免索引過大、超過 3072 位元組限制。VARCHAR 看似簡單,實則涉及**字元 vs 位元組、行長度上限、長度前綴、NULL 位圖、InnoDB Off-page、MyISAM Row Format、字元集編碼**等多層機制。深度理解這些細節,能做出精準的表結構設計,避免「能存下但查詢慢」、「遷移報錯」、「索引失效」等生產事故。