Буквы, регистр и цифры в названии требуют правил сравнения. Объясняем collation на примере каталога и разбираем, что проверить при переносе списка между системами.
Один каталог, два непривычных порядка
Представим условный каталог учебных материалов. Его перенесли в другую систему, и пользователи заметили, что названия с буквой «ё», заглавными буквами и цифрами расположены иначе. При этом сами названия не изменились. Причина может находиться в правилах сравнения текста, а не в потере записей при переносе.
Такие правила часто называют collation. Они определяют, как сопоставлять текстовые значения и какие различия учитывать. В PostgreSQL — системе управления базами данных — правила можно связывать с конкретными текстовыми данными и операциями. Поэтому выражения «по алфавиту» недостаточно для точного описания поведения во всех случаях.
Код символа не задаёт единственный человеческий порядок
Стандарт Unicode Collation Algorithm объясняет, что порядок зависит от языка, назначения списка и выбранных настроек. Один универсальный порядок кодов символов не может соответствовать всем языковым ожиданиям. Словарь, телефонный справочник и технический перечень могут предъявлять разные требования даже в пределах одного языка.
В нашем каталоге сначала нужно договориться о задаче. Для человека, который ищет название глазами, полезны привычные языковые правила. Для точного сопоставления технических идентификаторов могут быть важны различия, которые в обычном чтении кажутся незначительными. Ни один из вариантов не следует объявлять правильным без связи с назначением списка.
Какие различия учитываются
При сравнении могут иметь значение основной знак, диакритика — дополнительные элементы буквы, — регистр и пунктуация. Но конкретное поведение зависит от выбранного правила. Нельзя по одному названию языка обещать, что заглавные буквы всегда пойдут первыми или что все варианты с «е» и «ё» будут одинаково обработаны в любой системе.
Для учебной проверки предложим небольшой набор: названия, начинающиеся с «Е» и «Ё», одинаковые слова с разным регистром и два названия с числами два и десять, записанными цифрами. Нужно заранее описать ожидаемый порядок и отдельно решить, какие значения считаются различными. Это проверка требований, а не готовая настройка базы.
Откуда PostgreSQL получает правила
В документации PostgreSQL описаны разные поставщики правил, включая системную библиотеку и ICU — библиотеку поддержки языковых соглашений. Доступность и поведение связаны с поставщиком, его версией и локалью. Локаль — набор региональных и языковых настроек. Перенос между окружениями требует учитывать эту связку.
Для нашего примера предложим хранить описание принятого поведения рядом с требованиями к каталогу. Тогда при обновлении системы можно повторить ту же проверку и увидеть изменение. Перечень ожидаемых результатов полезнее неопределённого обещания «как раньше», особенно если старое поведение никто явно не зафиксировал.
Сортировка и равенство связаны, но вопросы различаются
Пользователь может хотеть видеть похожие названия рядом, но всё равно различать их как отдельные записи. Некоторые варианты сравнения PostgreSQL допускают равенство текстов, которые различаются представлением, например регистром при подходящих настройках. Поэтому изменение правил нужно рассматривать не только как косметическую перестановку списка, но и в контексте операций сравнения.
Предлагаемый порядок обсуждения: определить цель списка, составить примеры, записать ожидаемую сортировку и ожидаемое равенство, затем проверить выбранную реализацию. Если при переносе результат изменился, сначала сравните правила и версии. Исправлять сами названия только ради привычного порядка без выяснения причины не стоит: так можно изменить смысл исходных сведений.
Как связать это с изучением данных
Общее назначение языка раскрывает введение в SQL. О вспомогательных структурах поиска рассказывает статья об индексах. Понятность порядка для читателя и эффективность поиска — разные требования, которые стоит обсуждать вместе при проектировании каталога.
Изучать работу с таблицами можно на курсе SQL инженер. Для первого разбора достаточно объяснить, почему одинаковое содержимое не гарантирует одинакового порядка в разных окружениях, и показать несколько примеров ожидаемого поведения без записи программных выражений.


