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

MySQL 5.1 UTF-8 編碼下 VARCHAR 長度計算疑惑:字符與字節的區別、存儲上限實測

     編輯:MySQL 綜合教學

MySQL UTF-8 下 VARCHAR 長度單位解析:字符 vs 字節

現象對比

數據庫定義可存 10 字符可存漢字數
OracleVARCHAR2(10)103(1 漢字=3 字節)
MySQL 5.1VARCHAR(10)1010(1 漢字=1 字符)

根本原因

  • Oracle VARCHAR2 長度單位為字節(Byte)。UTF-8 下漢字佔 3 字節,故 10 字節只能存 3 個漢字。
  • MySQL 5.0+ VARCHAR(M) 長度單位為字符(Character),與字節無關。M 表示最大字符數,無論字母、數字、漢字、Emoji,最多存 M 個字符。

MySQL VARCHAR 存儲細節

  • 實際儲存:1-2 字節長度前綴 + 內容字節。
  • UTF-8 下:英文 1 字節,漢字 3 字節,Emoji 4 字節(utf8mb4)。
  • 最大行大小限制 65,535 字節,扣除長度前綴與其他列開銷。

實測驗證(MySQL 5.0.45, UTF-8)

  • VARCHAR(21845) 可建表,VARCHAR(21846) 報錯 Row size too large。
  • 計算:65535 / 3 ≈ 21845(全漢字極限)。
  • LENGTH('漢') → 3 字節;CHAR_LENGTH('漢') → 1 字符。

CHAR 定長類型行為

  • CHAR(10):固定儲存 10 字符,不足右補空格,讀取去除尾部空格。
  • UTF-8 下實際佔用字節可變(10~30 字節),但邏輯長度固定 10 字符。

總結

  1. MySQL VARCHAR(M) M = 字符數,非字節數。
  2. Oracle VARCHAR2(M) M = 字節數(預設),可指定 CHAR 語義。
  3. 設計表時,按業務字符數定義 VARCHAR 長度,無需換算字節。
  4. 若需限制字節大小(如外部系統對接),可用 CHECK (LENGTH(col) <= 100) 或應用層校驗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved