由於 MySQL 8.0 預設的 collation 是 utf8mb4_0900_ai_ci 而不是我原先以為「最精準」的 utf8mb4_unicode_ci,讓我好奇而查了一下,發現12

  • 0900 代表 Unicode Collation Algorithm (UCA) 的 9.0.0 版本,包含在 2016 年發佈的 Unicode 9.0.0 之中3。目前最新的版本是 11.0.04
  • ai 代表 accent insensitivity,即同一字母的不同標音不影響排序
  • ci 就是 case insensitivity 了,同一字母的大小寫不影響排序

所以,不管是從其他方面,或是我所認為的「精準」來說,utf8mb4_0900_ai_ci (UCA 9.0.0) 都比 utf8mb4_unicode_ci (UCA 4.0.0) 要來得好。甚至是在 MySQL 5.7.7 裡,也都有 utf8mb4_unicode_520_ci (UCA 5.2.0) 這個更好的選擇5

結論就是,在 MySQL 中,設定 UTF-8 編碼的最佳組合是:

  • 5.5.3+: charset=utf8mb4, collation=utf8mb4_unicode_ci
  • 5.7.7+: charset=utf8mb4, collation=utf8mb4_unicode_520_ci
  • 8.0.0+: charset=utf8mb4, collation=utf8mb4_0900_ai_ci

順便一提,utf8mb4 這個 charset 是在 MySQL 5.5.3 加入的6。在此之前,只有 utf8(5.5.3 之後等義於 utf8mb3)可用


  1. MySQL :: MySQL 8.0 Reference Manual :: 10.3.1 Collation Naming Conventions ↩︎

  2. What is the utf8mb4_0900_ai_ci Collation? - Monolune ↩︎

  3. Unicode 9.0.0 ↩︎

  4. The Unicode Blog: Last Call on Unicode 11.0 Review ↩︎

  5. mysql - Why is table CHARSET set to utf8mb4 and COLLATION to utf8mb4_unicode_520_ci - Stack Overflow ↩︎

  6. MySQL :: MySQL 5.5 Release Notes :: Changes in MySQL 5.5.3 (2010-03-24, Milestone 3) ↩︎