Spec-Zone .ru
спецификации, руководства, описания, API
|
Пример 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-умляут".
Первый столбец показывает результат SELECT
использование шведского/Финского правила сопоставления, которое
говорит что виды U-умляута с Y.
Второй столбец показывает результат SELECT
использование немецкого DIN 1 правило, которое говорит что виды
U-умляута с U.
Третий столбец показывает результат SELECT
использование немецкого DIN 2 правила, которые говорят что виды
U-умляута с UE.
Пример 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
стандартов).