При работе с текстовыми данными часто требуется поддержка различных языков и алфавитов. Для этого в SQL используются сортировочные правила — COLLATION. COLLATION определяет, как сравниваются и сортируются строки. Важно правильно задавать COLLATION на уровне столбца, таблицы или запроса, чтобы корректно работать с языковыми особенностями (например, ё ≠ е).
SELECT * FROM users ORDER BY username COLLATE 'ru_RU.UTF8';
Данный запрос сортирует пользователей по русскому алфавиту. В разных СУБД синтаксис collate может отличаться.
COLLATE utf8mb4_unicode_ci или utf8mb4_ru_0900_as_cs для учёта регистра и языка.COLLATE Cyrillic_General_CS_AS — поддержка русского языка, различие регистра (CS = case sensitive, AS = accent sensitive).Важно: COLLATION влияет и на поиск (LIKE, сравнения), не только на сортировку!
Какие существуют проблемы при сортировке строк с разным COLLATION в одном запросе, и можно ли агрегировать данные с разными сортировочными порядками без явных преобразований?
ОШИБКА: если COLLATION различается (например, у одного столбца — utf8mb4_unicode_ci, у второго — utf8mb4_bin), то при попытке сделать UNION или сравнить их напрямую, будет выброшена ошибка несовместимости COLLATION.
Правильно: всегда приводите строки к единому COLLATION через конструкцию COLLATE.
SELECT name COLLATE 'utf8mb4_unicode_ci' FROM customers UNION SELECT name COLLATE 'utf8mb4_unicode_ci' FROM suppliers;
История 1
В крупной e-commerce платформе при экспорте в Excel списков клиентов на русском языке заметили, что пользователи с именами, начинающимися на 'Ё', отображаются в самом конце списка, а на 'Е' — в начале. Причиной было различие COLLATION — использовался стандартный латинский, а не русский, и сортировка не соответствовала привычному алфавитному порядку. Пользователи жаловались на неочевидную сортировку.
История 2
В медицинской системе разные таблицы содержали строковые поля с разными COLLATION (по умолчанию и явным указанием русского). После изменения схемы таблицы агрегированные отчёты перестали работать, запрос стал выдавать "COLLATION conflict". Техподдержке пришлось в сотнях запросов явно прописывать COLLATE.
История 3
API для поиска по фамилии работал только с точным написанием заглавных и строчных букв (case sensitive), хотя пользователи ожидали невосприимчивости к регистру. Оказалось, столбец был создан с COLLATION *_CS, что делало поиск чувствительным к регистру. Исправили на *_CI (case insensitive), что решило проблему.