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

MySQL 中文儲存長度定義完全指南:字元 vs 位元組、utf8 vs utf8mb4

     編輯:MySQL 資料庫相關知識

MySQL 5.x 起 CHAR(N)/VARCHAR(N) 的 N 代表 **字元數 (Character)** 而非位元組數。但實際儲存位元組數取決於 **字元集**:

  • GBK:1 個漢字 = 2 位元組
  • UTF-8 (MySQL utf8):1 個漢字 = 3 位元組 (僅支援 BMP 字元,無 Emoji)
  • UTF-8MB4:1 個漢字 = 3 位元組,Emoji/補充字元 = 4 位元組 (完整 Unicode)

核心概念釐清

術語定義單位
字元抽象符號單位:一個漢字、一個英文字母、一個數字、一個符號Character
位元組電腦儲存最小單位:8 bitsByte
字元集字元到碼位的對應表 (如 Unicode)Charset
編碼碼位到位元組序列的演算法 (如 UTF-8)Collation/Encoding

實測驗證:VARCHAR(10) utf8mb4 表

CREATE TABLE t1 (str VARCHAR(10)) CHARSET=utf8mb4;
INSERT t1 VALUES ('一二三四五六七八九十');       -- 10 個漢字 ✓
INSERT t1 VALUES ('一二三四五六七八九十十一');   -- 11 個漢字 → 截斷存前 10 字
INSERT t1 VALUES ('abcdefghijklmnopqrst');     -- 20 英文字元 → 截斷存前 10 字
INSERT t1 VALUES ('1234567890123456');         -- 16 數字 → 截斷存前 10 字

結果證明:長度限制以字元計算,超出自動截斷 (SQL_MODE 未含 STRICT 時)。

定義「最多存 10 個漢字」的正確寫法

-- 任選一種字元集,長度皆寫 10
CREATE TABLE t_utf8mb4 (c VARCHAR(10)) CHARSET=utf8mb4;  -- 推薦,支援 Emoji
CREATE TABLE t_gbk (c VARCHAR(10)) CHARSET=gbk;          -- 相容舊系統

**位元組上限** 不同:utf8mb4 最大 40 位元組,gbk 最大 20 位元組,但應用層皆視為 10 字元。

避坑指南

  1. 新專案強制 utf8mb4:CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,避免 Emoji 存入報錯 (Incorrect string value)。
  2. 連線字串指定字元集:JDBC characterEncoding=utf8mb4、.NET CharSet=utf8mb4、PHP SET NAMES utf8mb4。
  3. 索引長度限制:InnoDB 單欄索引 ≤ 767 位元組 (預設) 或 3072 位元組 (innodb_large_prefix=ON)。VARCHAR(255) utf8mb4 = 1020 位元組可能超過,需縮短長度或升級設定。
  4. 資料截斷警告:啟用 SQL_MODE=STRICT_TRANS_TABLES 讓超長直接報錯而非靜默截斷。
  5. 長度語意:CHAR(10) 固定 10 字元 (不足右補空格),VARCHAR(10) 變長 0-10 字元 (額外 1-2 位元組儲存長度)。

快速對照表

需求建議定義最大位元組備註
純 ASCII (英文/數字)VARCHAR(20) CHARSET=ascii20最省空間
中文為主,無 EmojiVARCHAR(50) CHARSET=utf8mb4150通用推薦
需支援 Emoji/罕見字VARCHAR(100) CHARSET=utf8mb4400完整 Unicode
固定長度代碼 (如身分證)CHAR(18) CHARSET=ascii18定長效能略優
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved