了解 MySQL 字符集排序規則:它如何影響字串比較、排序與多語言效能

1. 介紹

MySQL 是最廣泛使用的資料庫管理系統之一,其關鍵功能之一,Collation 設定在決定字串資料的比較與排序方式上扮演關鍵角色。

Collation 的重要性

若沒有正確的 Collation 設定,搜尋結果可能不正確,或資料庫效能可能下降。
在多語系系統中尤其重要,準確的字元比較與搜尋對於系統正常運作至關重要。

本文將詳細說明 MySQL Collation——其設定、類型與關鍵考量,協助您更有效地管理資料庫。

2. Collation 是什麼?

Collation 定義了 MySQL 用來比較與排序字串值的規則。

Collation 的角色

  • 字串排序: 決定字串的排列方式。
  • 字串比較: 用於像 WHERE name = 'Sagawa' 之類的表達式。
  • 搜尋準確度: 影響多語系相容性。

與字元集的關係

Collation 與字元集密切相關。例如,utf8 字元集包含以下 Collation:

  • utf8_general_ci:不區分大小寫的比較。
  • utf8_bin:二進位(區分大小寫)比較。

命名慣例

character_set_name_comparison_method

範例:

  • utf8_general_ci:不區分大小寫(ci = case insensitive)。
  • utf8_bin:二進位比較。

3. MySQL 中的 Collation 級別

MySQL 允許在五個層級設定 Collation:

伺服器層級

SHOW VARIABLES LIKE 'collation_server';

要變更此設定,請編輯 my.cnf 並重新啟動伺服器:

[mysqld]
collation_server=utf8mb4_unicode_ci

資料庫層級

ALTER DATABASE db_name DEFAULT COLLATE utf8mb4_unicode_ci;

資料表層級

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

欄位層級

ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(255) COLLATE utf8mb4_unicode_ci;

字串文字層級

SELECT * FROM table_name WHERE column_name = 'value' COLLATE utf8mb4_bin;

4. 主要 Collation 類型與其特徵

utf8_general_ci

  • 特徵: 不區分大小寫且快速比較。
  • 備註: 精度較低;不完全符合 Unicode 標準。

utf8_unicode_ci

  • 特徵: 基於 Unicode 標準的高精度比較。
  • 備註:utf8_general_ci 稍慢。

utf8_bin

  • 特徵: 區分大小寫;要求完全匹配。
  • 使用情境: 密碼與識別碼。

utf8mb4_unicode_ci

  • 特徵: 遵循現代 Unicode 標準;支援多種語言。
  • 使用情境: 處理表情符號與特殊符號的應用程式。

5. 如何檢查與更改 Collation

您可以在資料庫、資料表或欄位層級檢查或修改 Collation。

檢查 Collation

資料庫 Collation

SELECT SCHEMA_NAME, DEFAULT_COLLATION_NAME 
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'database_name';

資料表 Collation

SHOW TABLE STATUS WHERE Name = 'table_name';

欄位 Collation

SHOW FULL COLUMNS FROM table_name;

更改 Collation

資料庫

ALTER DATABASE database_name
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;

資料表

ALTER TABLE table_name
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

欄位

ALTER TABLE table_name
MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

臨時 Collation 更改

在比較不同 Collation 的欄位時,請使用 COLLATE 子句以避免錯誤。

SELECT * FROM table_name
WHERE column1 COLLATE utf8mb4_unicode_ci = column2;

始終備份資料並在更改前檢查應用程式相容性。

6. 注意事項與最佳實踐

在 MySQL 中配置 Collation 時,請考慮以下預防措施與實踐,以確保最佳效能。

重要備註

混合不同的排序規則

比較或連接使用不同排序規則(collation)的欄位,可能會觸發錯誤。

  • 錯誤範例:
ERROR 1267 (HY000): Illegal mix of collations for operation '='
  • 解決方案: 使用 COLLATE 子句將排序規則標準化。
SELECT * FROM table_name
WHERE column1 COLLATE utf8mb4_unicode_ci = column2;

改變排序規則及現有資料

更改排序規則可能影響現有資料的比較或搜尋方式。

性能影響

  • utf8mb4_unicode_ci 更精確但速度較慢,相較於 utf8_general_ci
  • 對於大型資料集,排序規則的選擇會顯著影響查詢速度。

遷移問題

在修改排序規則時,請確保應用程式和其他系統的相容性。

最佳實務

1. 根據需求選擇排序規則

  • 精確度: 使用 utf8_unicode_ciutf8mb4_unicode_ci 以獲得精確比較。
  • 效能: 若精確度不那麼關鍵,使用 utf8_general_ci 以取得較快的比較速度。
  • 多語言支援: 為表情符號及特殊字元,建議使用 utf8mb4 為基礎的排序規則。

2. 保持一致性

  • 在資料庫、表格及欄位之間使用相同的排序規則,避免不匹配。
  • 只在必要時暫時使用 COLLATE

3. 變更前先測試與備份

  • 在測試環境中先測試配置變更。
  • 在執行任何更改前,務必備份正式資料。

4. 優化效能

  • 對於經常查詢的欄位(例如已建立索引的欄位),使用高效能排序規則。
  • 如有需要,按查詢調整排序規則。

5. 採用最新 Unicode 標準

對於多語系系統,使用 utf8mb4_0900_ai_ci 可提升精確度與相容性。

7. 結論

MySQL 的排序規則決定了字串資料在資料庫中的比較與排序方式。本指南涵蓋了排序規則的概念、設定方法、類型,以及有效排序規則管理的最佳實務。

重點回顧

  1. 定義: 排序規則控制字串比較與排序。選擇正確的排序規則可提升精確度與效能。
  2. 多層級: 排序規則可以設定於伺服器、資料庫、表格、欄位以及文字字面值等層級。
  3. 主要類型:
  • utf8_general_ci:速度快,但精確度較低。
  • utf8_unicode_ci:精確度高,但速度較慢。
  • utf8mb4_unicode_ci:符合 Unicode,且支援表情符號。
  1. 設定: 文章提供了查詢與修改排序規則的 SQL 範例。
  2. 最佳實務: 變更前務必測試並備份。

優化排序規則使用

排序規則直接影響字串比較與排序行為。遵循本文所述的方法與最佳實務,可在 MySQL 資料庫系統中同時維持精確度與效能。