Сопоставления (Collations)

Сопоставления в первую очередь влияют на сравнения строковых атрибутов. Они определяют как кодировку набора символов, так и стратегию, которую Manticore использует для сравнения строк при выполнении ORDER BY или GROUP BY с участием строкового атрибута.

Строковые атрибуты сохраняются в исходном виде во время индексации, и к ним не прикрепляется информация о наборе символов или языке. Это приемлемо, пока Manticore нужно только сохранить и вернуть строки вызывающему приложению дословно. Однако, когда вы просите Manticore отсортировать по строковому значению, запрос сразу становится неоднозначным.

Во-первых, строки с однобайтовой кодировкой (ASCII, ISO-8859-1 или Windows-1251) нужно обрабатывать иначе, чем строки в UTF-8, которые могут кодировать каждый символ переменным числом байт. Следовательно, нам нужно знать тип набора символов, чтобы правильно интерпретировать сырые байты как значимые символы.

Во-вторых, нам также нужны правила сортировки, специфичные для языка. Например, при сортировке по правилам США в локали en_US, акцентированный символ ï (маленькая буква i с умлаутом) должен располагаться где-то после z. Однако при сортировке по французским правилам и локали fr_FR он должен располагаться между i и j. Другой набор правил может вообще игнорировать акценты, позволяя произвольно смешивать ï и i.

В-третьих, в некоторых случаях требуется сортировка с учётом регистра, а в других — без учёта регистра.

Сопоставления инкапсулируют всё следующее: набор символов, языковые правила и чувствительность к регистру. В настоящее время Manticore предоставляет четыре сопоставления:

  1. libc_ci
  2. libc_cs
  3. utf8_general_ci
  4. binary

Первые два сопоставления опираются на несколько стандартных вызовов библиотеки C (libc) и, следовательно, могут поддерживать любую локаль, установленную в вашей системе. Они обеспечивают сравнения без учёта регистра (_ci) и с учётом регистра (_cs) соответственно. По умолчанию они используют локаль C, фактически сводя сравнения к побайтовым. Чтобы изменить это, нужно указать другую доступную локаль с помощью директивы collation_libc_locale. Список локалей, доступных в вашей системе, обычно можно получить с помощью команды locale:

$ locale -a
C
en_AG
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NG
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
es_ES
fr_FR
POSIX
ru_RU.utf8
ru_UA.utf8

Конкретный список локалей системы может отличаться. Обратитесь к документации вашей ОС для установки дополнительных необходимых локалей.

Локали utf8_general_ci и binary встроены в Manticore. Первая — это универсальное сопоставление для данных UTF-8 (без так называемой языковой адаптации); оно должно вести себя аналогично сопоставлению utf8_general_ci в MySQL. Вторая — простое побайтовое сравнение.

Сопоставление можно переопределить через SQL на уровне сессии с помощью оператора SET collation_connection. Все последующие SQL-запросы будут использовать это сопоставление. В противном случае все запросы будут использовать сопоставление по умолчанию сервера или указанное в директиве конфигурации collation_server. В настоящее время Manticore по умолчанию использует сопоставление libc_ci.

Сопоставления влияют на все сравнения строковых атрибутов, включая те, что внутри ORDER BY и GROUP BY, поэтому в зависимости от выбранного сопоставления могут возвращаться результаты с разным порядком или группировкой. Обратите внимание, что сопоставления не влияют на полнотекстовый поиск; для этого используйте charset_table.

Last modified: August 28, 2025