Spec-Zone .ru
спецификации, руководства, описания, API

10.4.4.1. Определение Сопоставления UCA Используя Синтаксис LDML

Чтобы добавить сопоставление UCA для набора символов Unicode, не перекомпилировав MySQL, используйте следующую процедуру. Если Вы незнакомы с правилами LDML, используемыми, чтобы описать характеристики вида сопоставления, см. Раздел 10.4.4.2, "Синтаксис LDML, Поддерживаемый в MySQL".

Пример добавляет названное сопоставление utf8_phone_ci к utf8 набор символов. Сопоставление разрабатывается для сценария, включающего Веб-приложение, для которого пользователи отправляют свои имена и телефонные номера. Номера телефона могут быть даны в совсем других форматах:

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

Проблема, повышенная, имея дело с этими видами значений, состоит в том, что переменные допустимые форматы делают поиск определенного номера телефона очень трудным. Решение состоит в том, чтобы определить новое сопоставление, которое переупорядочивает символы пунктуации, делая их игнорируемый.

  1. Выберите ID сопоставления, как показано в Разделе 10.4.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> элемент для набора символов, к которому сопоставление добавляется, и добавляет a <collation> элемент, который указывает на имя сопоставления и ID, чтобы связать имя с ID. В пределах <collation> элемент, обеспечьте a <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, добавьте a <collation> элемент к <charset name="ucs2"> элемент. Помните, что у каждого сопоставления должен быть свой собственный уникальный ID.

  5. Перезапустите сервер и используйте этот оператор, чтобы проверить, что сопоставление присутствует:

    mysql> SHOW COLLATION LIKE
                        '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)