Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

10.14.4.1 LDML 構文を使用した UCA 照合順序の定義

MySQL を再コンパイルせずに Unicode 文字セットの UCA 照合順序を追加するには、次の手順を使用します。 照合順序のソート特性の記述に使用する LDML ルールを把握していない場合は、セクション10.14.4.2「MySQL でサポートされる LDML 構文」を参照してください。

この例では、utf8_phone_ci という名前の照合順序を utf8 文字セットを追加します。 この照合順序は、ユーザーが名前と電話番号を投稿する Web アプリケーションに関連したシナリオ用に設計されています。 電話番号は、次のようなさまざまな形式で指定できます。

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

このような値を扱うときに生じる問題は、さまざまな形式が許容されることで、特定の電話番号の検索が非常に困難になるということです。 この解決方法として、句読点文字を並べ替えて無視できるようにする新しい照合順序を定義します。

  1. セクション10.14.2「照合順序 ID の選択」で示したように、照合順序 ID を選択します。 次のステップでは、1029 の ID を使用します。

  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> 要素を探し、照合順序名および ID を指定する <collation> 要素を追加して、名前を ID に関連付けます。 <collation> 要素内で、順序付けルールを含む <rules> 要素を提供します。

    <charset name="utf8">
      ...
      <collation name="utf8_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 = 'utf8_phone_ci';
    +---------------+---------+------+---------+----------+---------+
    | Collation     | Charset | Id   | Default | Compiled | Sortlen |
    +---------------+---------+------+---------+----------+---------+
    | utf8_phone_ci | utf8    | 1029 |         |          |       8 |
    +---------------+---------+------+---------+----------+---------+

次に、照合順序をテストして、目的のプロパティーがあることを確認します。

新しい照合順序を使用して、いくつかのサンプルの電話番号を含むテーブルを作成します。

mysql> CREATE TABLE phonebook (
         name VARCHAR(64),
         phone VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_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)