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

10.1.7.8. Примеры Эффекта Сопоставления

Пример 1: Сортировка немецких Умляутов

Предположите тот столбец X в таблице T имеет их latin1 значения столбцов:

MufflerMüllerMX SystemsMySQL

Предположите также, что значения столбцов получаются, используя следующий оператор:

SELECT X FROM T ORDER BY X COLLATE collation_name;

Следующая таблица показывает получающийся порядок значений, если мы используем ORDER BY с различными сопоставлениями.

latin1_swedish_ci latin1_german1_ci latin1_german2_ci
Глушитель Глушитель Мюллер
Системы MX Мюллер Глушитель
Мюллер Системы MX Системы MX
MySQL MySQL MySQL

Символ, который вызывает различные порядки сортировки в этом примере, является U с двумя точками по нему (ü), который немцы вызывают "U-умляут".

Пример 2: Поиск немецких Умляутов

Предположите, что у Вас есть три таблицы, которые отличаются только набором символов и используемым сопоставлением:

mysql> SET NAMES
        utf8;mysql> CREATE TABLE german1
        (    ->  c CHAR(10)    -> ) CHARACTER SET latin1 COLLATE latin1_german1_ci;mysql> CREATE TABLE german2 (    ->  c
        CHAR(10)    -> ) CHARACTER SET latin1 COLLATE
        latin1_german2_ci;mysql> CREATE TABLE germanutf8
        (    ->  c CHAR(10)    -> ) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Каждая таблица содержит две записи:

mysql> INSERT INTO german1 VALUES ('Bar'),
        ('Bär');mysql> INSERT INTO german2 VALUES ('Bar'),
        ('Bär');mysql> INSERT INTO germanutf8 VALUES ('Bar'),
        ('Bär');

Два из вышеупомянутых сопоставлений имеют A = Ä равенство, и у каждого нет такого равенства (latin1_german2_ci). По этой причине Вы получите эти результаты в сравнениях:

mysql> SELECT * FROM german1 WHERE c = 'Bär';+------+| c    |+------+| Bar  || Bär  |+------+mysql> SELECT * FROM german2 WHERE c = 'Bär';+------+| c    |+------+| Bär  |+------+mysql> SELECT * FROM germanutf8 WHERE c = 'Bär';+------+| c    |+------+| Bar  || Bär  |+------+

Это не ошибка, а скорее последствие свойств сортировки latin1_german1_ci и utf8_unicode_ci (показанная сортировка делается согласно немецкому DIN 5007 стандартов).