12.8.6 Примеры эффекта сортировки
Пример 1: Сортировка немецких умлаутов
Предположим, что столбец X в таблице T имеет следующие значения столбца:
Muffler
Müller
MX Systems
MySQL
Также предположим, что значения столбца извлекаются с помощью следующего оператора:
SELECT X FROM T ORDER BY X COLLATE collation_name;
Следующая таблица показывает порядок значений, если мы используем ORDER BY с различными сортировками.
latin1_swedish_ci | latin1_german1_ci | latin1_german2_ci |
|---|---|---|
| Muffler | Muffler | Müller |
| MX Systems | Müller | Muffler |
| Müller | MX Systems | MX Systems |
| MySQL | MySQL | MySQL |
Символ, вызывающий различные порядки сортировки в этом примере, это ü (немецкий “умлаут U”).
Первый столбец показывает результат
SELECTс использованием шведско-финской правила сортировки, которое указывает, что умлаут U сортируется с Y.Второй столбец показывает результат
SELECTс использованием немецкого правила DIN-1, которое указывает, что умлаут U сортируется с U.Третий столбец показывает результат
SELECTс использованием немецкого правила DIN-2, которое указывает, что умлаут U сортируется с UE.
Пример 2: Поиск немецких умлаутов
Предположим, что у вас есть три таблицы, которые отличаются только используемым набором символов и сортировкой:
mysql> SET NAMES utf8mb4;
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 utf8mb4 COLLATE utf8mb4_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 и utf8mb4_unicode_ci (показанная сортировка выполняется в соответствии с немецким стандартом DIN 5007).
© 2025 Oracle
Licensed under the GPLv2 License.