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

MySQL 校對集 utf8_unicode_ci vs utf8_general_ci:準確性與效能的權衡

     編輯:MySQL 資料庫相關知識

核心差異

維度utf8_unicode_ciutf8_general_ci
Unicode 標準支援部分支援 UCA (Unicode Collation Algorithm)舊版簡易實現,不支援擴展
字符展開支援 (如 ß = ss)不支援 (ß = s)
組合字符部分支援不支援
比較速度較慢 (複雜規則)較快 (逐字節比較)
適用語言多語言、德語、法語、越南語等英文、簡單西歐語系

具體比較範例

-- 兩者相同
Ä = A, Ö = O, Ü = U

-- 不同點
ß (德語銳音符)
utf8_general_ci : ß = s
utf8_unicode_ci : ß = ss  -- 符合德語拼寫規範

選型決策樹

  1. 應用涉及德語、法語、越南語、俄語少數民族語言 (Udmurt/Tatar/Bashkir/Mari) → **必選 utf8_unicode_ci**。
  2. 純英文/數字/簡單西歐字符,極度追求比較速度 → **可用 utf8_general_ci**。
  3. 不確定或混合語言 → **預設 utf8_unicode_ci** (準確性優先)。
  4. 新專案 → **直接使用 utf8mb4_unicode_ci / utf8mb4_0900_ai_ci** (MySQL 8.0 預設,支援完整 UCA 9.0.0)。

效能實測參考

  • 簡單 WHERE col = 'val' : general 快 ~5-10% (微秒級差異,通常可忽略)。
  • 大範圍排序 ORDER BY col : 差距擴大至 10-20%。
  • 索引建立/維護 : 同樣受校對集影響,unicode 稍慢。

遷移指南

-- 修改資料庫預設
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改表預設 (不轉換現有欄位)
ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 轉換現有欄位 (重建表,大表用 pt-osc)
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

結語

utf8_general_ci 是歷史產物,犧牲多語言正確性換取微小速度優勢。現代應用**預設選 utf8mb4_unicode_ci (或 8.0 utf8mb4_0900_ai_ci)**,唯有極端效能敏感且純 ASCII 場景才考慮 general。準確性是功能正確性的基石,不應為毫秒級速度妥協。

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