Spec-Zone.ru › MySQL 5.7

10.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 с двумя точками над ним (ü), который немцы называют “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).

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/charset-collation-effect.html

Spec-Zone.ru

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