首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 行記錄長度限制詳解:65535 字節邊界與字符集、NULL、VARCHAR 的實際影響

     編輯:MySQL 綜合教學

MySQL 行記錄長度限制詳解:65535 字節邊界與字符集、NULL、VARCHAR 的實際影響

MySQL 單行記錄最大長度硬性限制為 65,535 字節。但實際可用空間受字符集編碼、VARCHAR 長度前綴、NULL 位圖等因素顯著壓縮。本文量化分析各因素開銷,指導表結構設計避坑。

一、 核心限制

所有列定義長度之和 ≤ 65,535 bytes

超過報錯:Row size too large (> 8126). Changing some columns to TEXT or BLOB may help.

二、 字符集對定長/變長列的字節開銷

字符集英文/數字漢字/全角備註
latin11 byte不支持單字節編碼
gbk1 byte2 bytes雙字節編碼
utf8 (utf8mb3)1 byte3 bytesBMP 字符
utf8mb41 byte4 bytes含 Emoji/生僻字

實例

VARCHAR(100) CHARSET utf8mb4 最大佔用 100 × 4 = 400 bytes + 長度前綴。

三、 VARCHAR 變長列額外開銷

  • 長度前綴:1 或 2 字節。
      > 列最大長度 ≤ 255 bytes → 1 字節前綴。 > 列最大長度 > 255 bytes → 2 字節前綴。
  • 實際存儲 = 實際字符字節數 + 前綴字節數。

四、 NULL 值位圖開銷

  • 表中存在 允許 NULL 的列,每行固定開銷 CEILING(列數 / 8) 字節的 NULL 位圖。
  • 定義為 NOT NULL 可完全省去此開銷。

五、 實戰計算示例

表結構:

CREATE TABLE demo (
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) CHARSET utf8mb4,      -- 允許 NULL
  content VARCHAR(500) CHARSET utf8mb4,   -- 允許 NULL
  status TINYINT NOT NULL DEFAULT 0
) ENGINE=InnoDB;

單行最大理論長度計算

  • id (INT) = 4 bytes
  • name = 100 × 4 (utf8mb4) + 2 (前綴) = 402 bytes
  • content = 500 × 4 + 2 = 2002 bytes
  • status (TINYINT) = 1 byte
  • NULL 位圖 = 2 列允許 NULL → CEILING(2/8) = 1 byte
  • 總計 ≈ 2410 bytes ≪ 65535,安全。

極限壓測

若改為 VARCHAR(16000) utf8mb4 兩列:
單列 = 16000 × 4 + 2 = 64002 bytes → 兩列即超標。
解決:拆分大文本為 TEXT/MEDIUMTEXT/LONGTEXT(溢出頁存儲,僅在行內存 20 字節指針)。

六、 設計建議

  1. 優先使用 NOT NULL,省 NULL 位圖,利於優化器統計。
  2. 字符集統一 utf8mb4,預留 4 倍字節預算。
  3. 大文本字段拆離:超過 768 字節(InnoDB 行溢出閾值)建議用 TEXT 族類型。
  4. VARCHAR 長度按實際業務最大值設定,避免盲目設大導致前綴從 1 字節跳到 2 字節,或觸及行長度上限。
  5. 使用 SHOW TABLE STATUS 查看 Avg_row_length 監控實際行長度。

掌握行長度核算邏輯,可在建表階段規避「Row size too large」報錯,設計出緊湊高效的表結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved