文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.14.4.1 使用 LDML 語法定義 UCA 校對

若要為 Unicode 字元集新增 UCA 校對,而無需重新編譯 MySQL,請使用下列程序。如果您不熟悉用於描述校對排序特性的 LDML 規則,請參閱第 12.14.4.2 節,「MySQL 中支援的 LDML 語法」

此範例會將名為 utf8mb4_phone_ci 的校對新增至 utf8mb4 字元集。此校對的設計適用於涉及使用者發佈姓名和電話號碼的 Web 應用程式案例。電話號碼可以採用非常不同的格式。

+7-12345-67
+7-12-345-67
+7 12 345 67
+7 (12) 345 67
+71234567

處理這類值所產生的問題是,允許使用的格式各不相同,使得搜尋特定電話號碼變得非常困難。解決方案是定義新的校對,重新排序標點符號字元,使其可忽略。

  1. 選擇校對 ID,如第 12.14.2 節,「選擇校對 ID」所示。下列步驟使用 ID 1029。

  2. 修改 Index.xml 組態檔案。此檔案位於 character_sets_dir 系統變數所命名的目錄中。您可以如下檢查變數值,儘管路徑名稱在您的系統上可能有所不同:

    mysql> SHOW VARIABLES LIKE 'character_sets_dir';
    +--------------------+-----------------------------------------+
    | Variable_name      | Value                                   |
    +--------------------+-----------------------------------------+
    | character_sets_dir | /user/local/mysql/share/mysql/charsets/ |
    +--------------------+-----------------------------------------+
  3. 為校對選擇一個名稱,並將其列在 Index.xml 檔案中。此外,您必須提供校對排序規則。尋找要新增校對的字元集的 <charset> 元素,並新增一個 <collation> 元素,指示校對名稱和 ID,以將名稱與 ID 相關聯。在 <collation> 元素內,提供一個 <rules> 元素,其中包含排序規則。

    <charset name="utf8mb4">
      ...
      <collation name="utf8mb4_phone_ci" id="1029">
        <rules>
          <reset>\u0000</reset>
          <i>\u0020</i> <!-- space -->
          <i>\u0028</i> <!-- left parenthesis -->
          <i>\u0029</i> <!-- right parenthesis -->
          <i>\u002B</i> <!-- plus -->
          <i>\u002D</i> <!-- hyphen -->
        </rules>
      </collation>
      ...
    </charset>
  4. 如果想要其他 Unicode 字元集的類似校對,請新增其他 <collation> 元素。例如,若要定義 ucs2_phone_ci,請將 <collation> 元素新增至 <charset name="ucs2"> 元素。請記住,每個校對都必須有其唯一的 ID。

  5. 重新啟動伺服器,並使用此陳述式來驗證校對是否存在:

    mysql> SHOW COLLATION WHERE Collation = 'utf8mb4_phone_ci';
    +------------------+---------+------+---------+----------+---------+
    | Collation        | Charset | Id   | Default | Compiled | Sortlen |
    +------------------+---------+------+---------+----------+---------+
    | utf8mb4_phone_ci | utf8mb4 | 1029 |         |          |       8 |
    +------------------+---------+------+---------+----------+---------+

現在測試校對,以確保它具有所需的屬性。

使用新的校對建立一個包含一些範例電話號碼的表格:

mysql> CREATE TABLE phonebook (
         name VARCHAR(64),
         phone VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_phone_ci
       );
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO phonebook VALUES ('Svoj','+7 912 800 80 02');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO phonebook VALUES ('Hf','+7 (912) 800 80 04');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO phonebook VALUES ('Bar','+7-912-800-80-01');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO phonebook VALUES ('Ramil','(7912) 800 80 03');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO phonebook VALUES ('Sanja','+380 (912) 8008005');
Query OK, 1 row affected (0.00 sec)

執行一些查詢,以查看在比較和排序時,是否實際上忽略了標點符號字元:

mysql> SELECT * FROM phonebook ORDER BY phone;
+-------+--------------------+
| name  | phone              |
+-------+--------------------+
| Sanja | +380 (912) 8008005 |
| Bar   | +7-912-800-80-01   |
| Svoj  | +7 912 800 80 02   |
| Ramil | (7912) 800 80 03   |
| Hf    | +7 (912) 800 80 04 |
+-------+--------------------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM phonebook WHERE phone='+7(912)800-80-01';
+------+------------------+
| name | phone            |
+------+------------------+
| Bar  | +7-912-800-80-01 |
+------+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM phonebook WHERE phone='79128008001';
+------+------------------+
| name | phone            |
+------+------------------+
| Bar  | +7-912-800-80-01 |
+------+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM phonebook WHERE phone='7 9 1 2 8 0 0 8 0 0 1';
+------+------------------+
| name | phone            |
+------+------------------+
| Bar  | +7-912-800-80-01 |
+------+------------------+
1 row in set (0.00 sec)