Spec-Zone .ru
спецификации, руководства, описания, API
|
Чтобы добавить сопоставление 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
Проблема, повышенная, имея дело с этими видами значений, состоит в том, что переменные допустимые форматы делают поиск определенного номера телефона очень трудным. Решение состоит в том, чтобы определить новое сопоставление, которое переупорядочивает символы пунктуации, делая их игнорируемый.
Выберите ID сопоставления, как показано в Разделе 10.4.2, "Выбирая ID Сопоставления". Следующие шаги используют ID 1029.
Изменить Index.xml
конфигурационный файл. Этот файл
будет расположен в каталоге, названном character_sets_dir
системная переменная. Можно проверить значение
переменной следующим образом, хотя путь мог бы отличаться на Вашей системе:
mysql> SHOW VARIABLES LIKE
'character_sets_dir';
+--------------------+-----------------------------------------+| Variable_name | Value |+--------------------+-----------------------------------------+| character_sets_dir | /user/local/mysql/share/mysql/charsets/ |+--------------------+-----------------------------------------+
Выберите имя для сопоставления и перечислите его в 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>
Если Вы хотите подобное сопоставление для других наборов символов Unicode, добавьте
другой <collation>
элементы. Например, чтобы определить ucs2_phone_ci
, добавьте a <collation>
элемент к <charset name="ucs2">
элемент. Помните, что у
каждого сопоставления должен быть свой собственный уникальный ID.
Перезапустите сервер и используйте этот оператор, чтобы проверить, что сопоставление присутствует:
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)