Spec-Zone.ru › MySQL 5.7

10.14.4.1 Определение сортировки UCA с использованием синтаксиса LDML

Для добавления сортировки UCA для набора символов Unicode без перекомпиляции MySQL используйте следующую процедуру. Если вы не знакомы с правилами LDML, используемыми для описания характеристик сортировки, см. раздел 10.14.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. Выберите идентификатор сортировки, как показано в разделе 10.14.2 «Выбор идентификатора сортировки». В следующих шагах используется идентификатор 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>, который указывает имя и идентификатор сортировки, чтобы связать имя с идентификатором. Внутри элемента <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">. Помните, что каждая сортировка должна иметь свой уникальный идентификатор.

  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)

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/ldml-collation-example.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API