Spec-Zone.ru › MySQL 9.2

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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/charset-collation-effect.html

Spec-Zone.ru

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