MySQL и MariaDB LinuxWindowsmacOS

Как восстановить правильную сортировку кириллицы в MySQL

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

После изменения COLLATE/кодировки MySQL сортировка русских слов и результаты сравнения строк могут измениться: разные правила учитывают регистр, акценты и Unicode-веса. В MySQL 8.0/8.4 новые utf8mb4_0900_* отличаются от старых utf8mb4_general_ci. Нужно выяснить фактическую collation столбца и ожидаемый порядок, а не глобально менять всю базу ради одного отчёта.

В этой статье
  1. Что означает неисправность
  2. Возможные причины и признаки
  3. Пошаговая диагностика и решение
  4. Команды для диагностики и проверки
  5. Пример для отдельной тестовой базы или учебного проекта
  6. Проверка результата и дальнейшие действия

#Что означает неисправность

После изменения COLLATE/кодировки MySQL сортировка русских слов и результаты сравнения строк могут измениться: разные правила учитывают регистр, акценты и Unicode-веса. В MySQL 8.0/8.4 новые utf8mb4_0900_* отличаются от старых utf8mb4_general_ci. Нужно выяснить фактическую collation столбца и ожидаемый порядок, а не глобально менять всю базу ради одного отчёта.

#Возможные причины и признаки

Возможная причинаКак узнатьЧто делать
Изменена collation колонкиORDER BY использует правила сравнения, заданные столбцу; миграция могла поменять её.SHOW FULL COLUMNS теперь показывает новую сортировку, а прежний дамп — старую.Испытать явную COLLATE в SELECT и согласовать новую политику.
Порядок при одинаковых весах неопределёнСтроки, равные с точки зрения collation, не имеют гарантированного порядка без дополнительного ключа.После смены версии одинаковые или похожие значения чередуются между запросами.Добавить устойчивый вторичный критерий ORDER BY.
Неверное сравнение строк после смены кодировкиВ колонке могут оказаться искажённые байты из старого импорта.Не только порядок, но и сами названия отображаются неправильно.Разобрать исходную кодировку; COLLLATE не восстанавливает испорченный текст.

#Пошаговая диагностика и решение

  1. Зафиксируйте неправильный порядок и точный запросОткройте страницу каталога или отчёт, где изменился порядок, запишите несколько соседних русских названий и сравните с прежним ожидаемым списком. Сохраните используемый SELECT ... ORDER BY и версию сервера. Не переключайте сортировку базы наугад: изменение правил может затронуть уникальные индексы, поиск и сравнения JOIN.
  2. Уточните версию MySQL и правила сортировки колонкиВ Workbench подключитесь к нужной схеме → SQL Editor, либо войдите в mysql-клиент через терминал. Выполните SELECT VERSION(); и SHOW FULL COLUMNS FROM categories; с заменой categories на таблицу из своего запроса. В колонке Collation найдите реальное значение для поля title. Значение серверной базы по умолчанию не всегда отражает collation уже созданного столбца.
  3. Проверьте, каким выражением сортирует сам запросВ SQL-редакторе посмотрите ORDER BY: используется ли отдельная колонка, выражение LOWER, CONCAT, псевдоним SELECT или явное COLLATE. Для каждого строкового выражения правила могут отличаться. Если запрос сортирует BINARY title, это сравнение байтов, а не русский алфавит; не подменяйте им ожидаемый языковой порядок.
  4. Проведите безопасный эксперимент с COLLATE в SELECTСделайте SELECT только для ограниченной выборки с ORDER BY title COLLATE utf8mb4_unicode_ci, id, если столбец в кодировке utf8mb4 и такая сортировка доступна. Это проверка только для чтения и не меняет хранимые данные. Если сервер выдаёт Unknown collation, сначала выполните SHOW COLLATION LIKE ... и выберите поддерживаемую сортировку.
  5. Сравните варианты по контрольному набору кириллицыВ собственной тестовой базе создайте временную таблицу со словами на русском, включающими Е/Ё и разные регистры; сравните ORDER BY title COLLATE ... для нескольких известных правил. Не делайте вывод об алфавитной корректности только из 2–3 элементов: согласуйте требуемый порядок у владельца каталога и проверьте особые знаки, сокращения и повторяющиеся названия.
  6. Добавьте устойчивый порядок при совпадении сортировочных весовЕсли несколько строк сравниваются как равные, добавьте в конец ORDER BY уникальный id либо другое стабильное поле, например ORDER BY title COLLATE utf8mb4_unicode_ci, id. Тогда одинаковые значения не будут прыгать между страницами выдачи при постраничном выводе. Изменение должно сопровождаться проверкой корректности пагинации и индексов.
  7. Не меняйте collation всей таблицы без проверки зависимостейЕсли согласованное правило требуется во всех запросах и поиск тоже должен следовать ему, запланируйте миграцию конкретного столбца после резервной копии. Перед ALTER TABLE проверьте уникальные индексы: строки, которые теперь сравниваются как равные, могут вызвать конфликт. На большой таблице оцените необходимость перестроения индекса и блокировки, а также сортировку на репликах.
  8. Повторите сортировку и сравните результат с эталономЗапустите тот же SELECT в тестовом каталоге, посмотрите полный порядок контрольных записей и проверьте страницы с одинаковыми названиями. Ошибок Unknown collation быть не должно, порядок должен соответствовать согласованным правилам. Если результат отличается, верните прежний ORDER BY из системы версий и повторно исследуйте charset, collation и данные без изменения рабочей схемы.

#Команды для диагностики и проверки

SQLКоманда
Чтение метаданных в MySQL SQL Editor. categories — пример таблицы, замените на свою; последняя команда показывает наличие конкретной collation.
SELECT VERSION();
SHOW FULL COLUMNS FROM categories;
SHOW COLLATION LIKE 'utf8mb4_unicode_ci';
SQLКоманда
Безопасная пробная сортировка только при utf8mb4 и существующих колонках id/title. Замените таблицу и поля по своему запросу; LIMIT ограничивает число возвращённых строк.
SELECT id, title FROM categories ORDER BY title COLLATE utf8mb4_unicode_ci, id LIMIT 20;

#Пример для отдельной тестовой базы или учебного проекта

SQL
Запускается в тестовой сессии, не затрагивает постоянные данные. Проверьте порядок вручную; решение о правилах Е/Ё принимайте после сравнения с эталонным списком.
CREATE TEMPORARY TABLE whelp_words (id INT PRIMARY KEY, title VARCHAR(30) CHARACTER SET utf8mb4);
INSERT INTO whelp_words VALUES (1,'Ёж'),(2,'Ель'),(3,'ёж'),(4,'Яблоко');
SELECT id,title FROM whelp_words ORDER BY title COLLATE utf8mb4_unicode_ci, id;

#Проверка результата и дальнейшие действия

Задача решена, если тот же запрос стабильно выдаёт согласованный порядок кириллицы и не теряет строки между страницами. Если русский алфавит восстановлен, но уникальная регистрация стала запрещать новые логины, проверьте влияние выбранной collation на уникальные индексы. При спорном порядке Е/Ё явно зафиксируйте правило продукта и тест для следующих обновлений.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.