首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL VARCHAR 最大長度深度解析:65535 只是理論值

     編輯:MySQL 資料庫相關知識

前言:一個看似簡單卻暗藏玄機的問題

許多開發者一直以為 VARCHAR 的最大長度就是 65535,畢竟它用 2 個字節存儲長度(長度 < 255 時用 1 個字節)。然而,實際情況遠比這複雜。在 InnoDB 的 COMPACT 行格式下,每行記錄有一個字節用於標記 NULL 列的分佈。這導致 VARCHAR 的真實上限會根據表結構(是否存在允許 NULL 的列)而發生變化。

實測驗證:NULL 屬性如何影響上限

在 InnoDB + latin1 環境下進行測試:

-- 成功:不允許 NULL,最大 65533
CREATE TABLE test(name VARCHAR(65533) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 失敗:允許 NULL,最大只能 65532
CREATE TABLE test(name VARCHAR(65533)) ENGINE=InnoDB DEFAULT CHARSET=latin1;

結果證實:無 NOT NULL 限制時上限為 65533;有 NULL 列時上限降為 65532。這是因為 NULL 位圖佔用了 1 個字節。

三大核心限制規則

1. 存儲限制

VARCHAR 將實際內容單獨存儲於聚簇索引外,開頭用 1~2 字節記錄長度(>255 時用 2 字節),故理論上限 65535 字節。

2. 編碼長度限制

  • GBK:每字符最多 2 字節 → 最大長度 32766
  • UTF8:每字符最多 3 字節 → 最大長度 21845
  • 超過此限制會被強制轉為 TEXT 類型並產生 Warning

3. 行長度限制(關鍵)

MySQL 要求單行定義長度不超過 65535 字節(不含 BLOB/TEXT)。公式:

行長度 = 1 (NULL位圖) + 2 (VARCHAR長度前綴) + 列定義長度總和

實戰計算範例

範例 A:單列 VARCHAR(GBK)

CREATE TABLE t4(c VARCHAR(N)) CHARSET=gbk;
N_max = (65535 - 1 - 2) / 2 = 32766

範例 B:多列混合表

CREATE TABLE t4(c INT, c2 CHAR(30), c3 VARCHAR(N)) CHARSET=utf8;
N_max = (65535 - 1 - 2 - 4 - 30×3) / 3 = 21812

若超過編碼限制被轉為 TEXT,每列固定佔 11 字節定義長度,已非 VARCHAR。

總結

  • 理論上限 65535,實際可用 65533(無 NULL 列)或 65532(有 NULL 列)
  • 字符集編碼進一步降低字符數上限:GBK 約 3.2 萬,UTF8 約 2.1 萬
  • 真正的瓶頸往往是「行定義長度 65535」而非單列長度
  • 設計表時務必預留餘量,避免因加列導致 Row size too large 報錯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved