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