Функциональность правил сортировки позволяет определять порядок сортировки и правила классификации символов для данных на уровне отдельных столбцов или даже отдельных операций. Это снимает ограничение, согласно которому
LC_COLLATE и LC_CTYPE параметры базы данных нельзя изменить после ее создания.
Концептуально каждое выражение типа данных, поддерживающего сопоставление, имеет определенные правила сортировки. (Встроенными типами данных, поддерживающими правила сортировки, являются
text, varcharи char. Пользовательские базовые типы также могут быть помечены как сопоставимые (collatable), и, разумеется, domain над типом данных, поддерживающим правила сортировки, также их поддерживает.) Если выражение является ссылкой на столбец, то правилами сортировки выражения являются правила сортировки, определенные для данного столбца. Если выражение является константой, то правилами сортировки являются правила сортировки по умолчанию для типа данных этой константы. Правила сортировки более сложного выражения выводятся из правил сортировки его входных параметров, как описано ниже.
Правилами сортировки выражения могут быть «правила сортировки по умолчанию» , что соответствует настройкам локали, определенным для базы данных. Также возможна ситуация, когда правила сортировки выражения не определены. В таких случаях операции упорядочивания и другие операции, требующие наличия правил сортировки, завершатся ошибкой.
Когда системе баз данных необходимо выполнить сортировку или классификацию символов, она использует правила сортировки входного выражения. Это
происходит, например, в ORDER BY предложениях
и при вызовах функций или операторов, таких как <.
Правила сортировки, применяемые для ORDER BY предложения,
— это непосредственно правила сортировки ключа сортировки. Правила сортировки для вызова
функции или оператора определяются на основе аргументов, как описано
ниже. Помимо операторов сравнения, правила сортировки учитываются функциями, преобразующими регистр символов (из нижнего в верхний и наоборот), такими как lower, upper, и
initcap; операторами сопоставления с образцом, а также
to_char и сопутствующими функциями.
При вызове функции или оператора правила сортировки, определенные путем анализа параметров аргументов, используются во время выполнения для выполнения указанной операции. Если результат вызова функции или оператора относится к типу данных, поддерживающему правила сортировки, то данные правила также используются на этапе синтаксического анализа в качестве определенных правил сортировки выражения функции или оператора, если внешнее выражение требует наличия этой информации.
Определение правил сортировки определение правил сортировки выражения может быть
неявным или явным. Данное различие влияет на порядок объединения правил сортировки в случаях, когда в одном выражении используются несколько различных правил сортировки. Явное определение правил сортировки происходит в том случае, когда
COLLATE используется в качестве предложения; все прочие варианты определения правил сортировки являются неявными. В ситуациях, когда необходимо объединить несколько правил сортировки (например, при вызове функции), применяются следующие правила:
Если для любого входного выражения правила сортировки определены явно, то все явно определенные правила сортировки среди входных выражений должны совпадать, иначе будет выдана ошибка. Если присутствует какое-либо явно определенное правило сортировки, оно становится результатом объединения правил сортировки.
В противном случае все входные выражения должны иметь одинаковое неявное определение правил сортировки или правила сортировки по умолчанию. Если присутствует правило сортировки, отличное от используемого по умолчанию, оно становится результатом объединения правил сортировки. В противном случае результатом являются правила сортировки по умолчанию.
Если среди входных выражений присутствуют конфликтующие неявные правила сортировки, отличные от правил по умолчанию, то такая комбинация считается имеющей неопределенные правила сортировки. Данная ситуация не является ошибочной, за исключением случаев, когда конкретной вызываемой функции требуются сведения о правилах сортировки, которые ей необходимо применить. В этом случае во время выполнения будет выдана ошибка.
В качестве примера рассмотрим следующее определение таблицы:
CREATE TABLE test1 (
a text COLLATE "de_DE",
b text COLLATE "es_ES",
...
);
Тогда в запросе
SELECT a < 'foo' FROM test1;
операция < сравнения выполняется в соответствии с
de_DE правилами "de_DE", так как в выражении сочетаются неявно определенные правила сортировки с правилами сортировки по умолчанию. Однако в
SELECT a < ('foo' COLLATE "fr_FR") FROM test1;
сравнение выполняется с использованием fr_FR правила, поскольку явное определение правил сортировки переопределяет неявное. Более того, учитывая
SELECT a < b FROM test1;
парсер не может определить, какие правила сортировки следует применить, так как
a и b столбцы имеют конфликтующие неявные правила сортировки. Поскольку < оператору
необходимо знать, какие правила сортировки использовать, это приведет к
ошибке. Данную ошибку можно устранить, указав явные правила сортировки для любого из входных выражений:
SELECT a < b COLLATE "de_DE" FROM test1;
или эквивалентным способом:
SELECT a COLLATE "de_DE" < b FROM test1;
С другой стороны, структурно схожий случай
SELECT a || b FROM test1;
не приводит к ошибке, так как данный || оператор
не зависит от правил сортировки: его результат будет одинаковым независимо
от используемых правил сортировки.
Правила сортировки, назначенные для комбинированных входных выражений функции или оператора, также применяются к результату функции или оператора, если они возвращают данные типа, поддерживающего правила сортировки. Таким образом, в
SELECT * FROM test1 ORDER BY a || 'foo';
сортировка будет выполняться в соответствии с de_DE правилами.
Однако следующий запрос:
SELECT * FROM test1 ORDER BY a || b;
приводит к ошибке, так как, хотя || оператору
не требуются сведения о правилах сортировки, они необходимы ORDER BY предложению. Как и прежде, конфликт можно разрешить с помощью явного указания правил сортировки:
SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";
Объект «правила сортировки» (collation) является объектом схемы SQL, сопоставляющим имя SQL с локалями, которые предоставляются установленными в операционной системе библиотеками. Определение правил сортировки
содержит параметр provider , который определяет библиотеку, предоставляющую данные локали. Одним из стандартных имен провайдеров
является libc, использующий локали из библиотеки C операционной системы. Эти локали используются большинством системных инструментов операционной системы. Другим провайдером
является icu, который использует внешнюю
библиотеку ICU library.
Объект правил сортировки, предоставляемый libc сопоставляется с
комбинацией LC_COLLATE и LC_CTYPE
параметров, принимаемых setlocale() вызовом системной библиотеки. (Как следует из названия, основное назначение правил сортировки — установить
LC_COLLATE, который определяет порядок сортировки. Однако
на практике редко требуется, чтобы значение параметра
LC_CTYPE отличалось от
LC_COLLATE, поэтому удобнее объединить их в рамках одной концепции, чем создавать отдельную инфраструктуру для настройки LC_CTYPE на выражение.) Кроме того, libc правила сортировки
привязаны к определенной кодировке символов (см. Раздел 3.8.3).
Одно и то же имя правил сортировки может использоваться для различных кодировок.
Объект правил сортировки, предоставляемый icu сопоставляется с именованным объектом сортировки (collator), предоставляемым библиотекой ICU. ICU не поддерживает
раздельные «collate» и «ctype» , поэтому они всегда одинаковы. Кроме того, правила сортировки ICU не зависят от кодировки, поэтому в базе данных всегда существует только одно правило сортировки ICU с данным именем.
На всех платформах поддерживаются следующие правила сортировки:
unicode
Это стандартное правило сортировки SQL выполняет сортировку с использованием Unicode Collation
Algorithm с таблицей Default Unicode Collation Element Table. Оно
доступно во всех кодировках. Для использования этого правила сортировки требуется поддержка ICU,
и его поведение может измениться, если Postgres собран с другой
версией ICU. (Это правило сортировки ведет себя так же, как
корневая локаль ICU; см. und-x-icu (для «не определено»).)
ucs_basic
Это стандартное правило сортировки SQL выполняет сортировку на основе значений кодовых точек Юникода,
а не в порядке, принятом в естественных языках, и только для символов ASCII
«A» по
«Z» трактуются как буквы.
поведение эффективно и стабильно во всех версиях. Доступно только
для кодировки UTF8. (Данные правила сортировки имеют то же
поведение, что и спецификация локали libc C в
UTF8 кодировке.)
pg_c_utf8
Данные правила сортировки выполняют сортировку по значениям кодовых точек Юникода, а не в
языковом порядке. Для функций lower,
initcapи upper, используется
простое сопоставление регистров Юникода. Для сопоставления с шаблоном (включая регулярные
выражения), используется POSIX-совместимый вариант Unicode Compatibility
Properties. Данное поведение эффективно и стабильно в рамках
Postgres мажорной версии. Данная колляция
доступна только для кодировки UTF8.
C (эквивалентно POSIX)
Функции C и POSIX правила сортировки являются
основанными на «традиционном поведении C» Сортировка выполняется по значениям
байтов, а не в порядке, принятом в естественных языках; учитываются только символы ASCII
«A» по
«Z» трактуются как буквы.
поведение эффективно и стабильно во всех версиях для конкретной
кодировки базы данных, однако оно может различаться для разных
кодировок.
правила сортировки по умолчанию
Функции правила сортировки по умолчанию параметр collation выбирает локаль, указанную
при создании базы данных.
Дополнительные правила сортировки могут быть доступны в зависимости от поддержки в операционной системе. Эффективность и стабильность этих дополнительных правил сортировки зависят от провайдера правил сортировки, его версии и используемой локали.
Если операционная система поддерживает использование нескольких локалей
в рамках одной программы (newlocale и сопутствующих функций),
либо если настроена поддержка ICU,
то при инициализации кластера баз данных initdb
заполняет системный каталог pg_collation правилами сортировки на основе всех локалей, обнаруженных в операционной системе в это время.
Для просмотра доступных в данный момент локалей используйте запрос SELECT
* FROM pg_collation, или команду \dOS+
в psql.
Например, операционная система может предоставлять локаль с именем de_DE.utf8.
initdb затем создаст правила сортировки с именем
de_DE.utf8 для кодировки UTF8
которая включает как LC_COLLATE так и
LC_CTYPE установленным в de_DE.utf8.
Это также позволит создать правило сортировки, в названии которого .utf8
будет отсечено. Таким образом, можно использовать правило сортировки
с именем de_DE, что удобнее
при написании и делает имя менее зависимым от кодировки. Обратите внимание, что начальный набор имен правил сортировки, тем не менее, зависит от платформы.
Стандартный набор правил сортировки, предоставляемый libc напрямую соответствуют локалям, установленным в операционной системе; их список можно получить с помощью команды locale -a. В случае,
если libc необходимы правила сортировки, имеющие другие значения для LC_COLLATE и LC_CTYPE, или если в операционной системе после инициализации экземпляра базы данных были установлены новые локали, то новые правила сортировки могут быть созданы с помощью CREATE COLLATION .
Новые локали операционной системы также можно импортировать массово, используя
функцию pg_import_system_collations() function.
В рамках любой конкретной базы данных интерес представляют только те правила сортировки, которые совместимы с кодировкой этой базы данных. Прочие записи в
pg_collation игнорируются. Таким образом, краткое имя правил сортировки, такое как de_DE можно считать уникальным
в рамках данной базы данных, даже если оно не является глобально уникальным.
Рекомендуется использовать краткие имена правил сортировки, так как это
сократит объем вносимых изменений при переходе на
другую кодировку базы данных. Однако обратите внимание, что правила сортировки по умолчанию,
Cи POSIX правила сортировки могут использоваться независимо от кодировки базы данных.
Digital Q.DataBase считает различные объекты правил сортировки несовместимыми, даже если они имеют идентичные свойства. Так, например,
SELECT a COLLATE "C" < b COLLATE "POSIX" FROM test1;
приведет к ошибке, даже если C и POSIX
правила сортировки ведут себя идентично. Поэтому смешивание кратких и полных имен правил сортировки не рекомендуется.
При использовании ICU перечисление всех возможных имен локалей нецелесообразно. ICU
использует специфическую систему именования локалей, однако способов
задать имя локали гораздо больше, чем фактически существующих локалей.
initdb использует API ICU для извлечения набора отдельных локалей с целью формирования исходного набора правил сортировки. Правила сортировки, предоставляемые ICU, создаются в среде SQL с именами в формате языковых тегов BCP 47. При этом используется «частное»
расширение -x-icu , которое добавляется для их отличия от локалей libc.
Ниже приведены примеры правил сортировки, которые могут быть созданы:
de-x-icu #Немецкие правила сортировки, вариант по умолчанию
de-AT-x-icu #Немецкие правила сортировки для Австрии, вариант по умолчанию
(Существуют также, например, de-DE-x-icu
или de-CH-x-icu, но на момент написания данного документа они
эквивалентны de-x-icu.)
und-x-icu (для «не определено») #ICU «root» правил сортировки. Используйте этот вариант для получения корректного не зависящего от языка порядка сортировки.
Некоторые (редко используемые) кодировки не поддерживаются ICU. Если кодировка базы данных относится к их числу, записи правил сортировки ICU в pg_collation игнорируются. Попытка использования такой кодировки
вызовет ошибку следующего вида: «правила сортировки "de-x-icu" для кодировки "WIN874" не существуют».
Если стандартных и предопределенных правил сортировки недостаточно, пользователи могут создавать собственные объекты правил сортировки с помощью SQL-команды CREATE COLLATION.
Стандартные и предопределенные правила сортировки расположены в схеме pg_catalog, как и все предопределенные объекты.
Пользовательские правила сортировки следует создавать в схемах пользователей. Это также
гарантирует их сохранение средствами pg_dump.
Новые правила сортировки libc можно создать следующим образом:
CREATE COLLATION german (provider = libc, locale = 'de_DE');
Конкретные значения, допустимые для локаль
параметра в этой команде, зависят от операционной системы. В Unix-подобных
системах команда locale -a выведет соответствующий список.
Так как предопределенные правила сортировки libc уже включают все правила сортировки, определенные в операционной системе на момент инициализации экземпляра базы данных, необходимость в ручном создании новых возникает редко. Это может потребоваться при использовании иной системы именования (в этом случае см. также Раздел 3.8.2.2.3.3) или после обновления операционной системы для поддержки новых определений локалей (в этом случае см. также pg_import_system_collations()).
Правила сортировки ICU можно создать следующим образом:
CREATE COLLATION german (provider = icu, locale = 'de-DE');
Локали ICU указываются как языковой тег BCP 47 языковой тег, но также могут принимать большинство имен локалей в стиле libc. По возможности имена локалей в стиле libc преобразуются в языковые теги.
Новые правила сортировки ICU позволяют детально настраивать поведение сортировки путем включения атрибутов сортировки в языковой тег. См. Раздел 3.8.2.3 для получения подробных сведений и примеров.
Команда CREATE COLLATION также может применяться для создания новых правил сортировки на основе существующих. Это может быть полезно для использования имен правил сортировки, не зависящих от операционной системы, создания имен для совместимости или использования правил сортировки ICU под более понятными именами. Например:
CREATE COLLATION german FROM "de_DE"; CREATE COLLATION french FROM "fr-x-icu";
Правила сортировки могут быть либо детерминированными либо недетерминированными. Детерминированные правила сортировки используют детерминированное сравнение, при котором строки считаются равными только в том случае, если они состоят из идентичной последовательности байтов. При недетерминированном сравнении строки могут быть признаны равными, даже если они состоят из разных байтов. Типичные случаи включают сравнение без учета регистра или диакритических знаков, а также сравнение строк в различных формах нормализации Юникода. Фактическая реализация подобных регистронезависимых сравнений возлагается на провайдер правил сортировки; флаг deterministic определяет лишь то, будут ли идентичные с точки зрения правил элементы различаться при помощи побайтового сравнения. См. также Технический стандарт Unicode 10 для получения более подробной информации о терминологии.
Для создания недетерминированных правил сортировки укажите параметр
deterministic = false в команде CREATE
COLLATION, например:
CREATE COLLATION ndcoll (provider = icu, locale = 'und', deterministic = false);
В данном примере стандартные правила сортировки Юникод используются недетерминированным образом. В частности, это позволяет корректно сравнивать строки в различных формах нормализации. Более сложные примеры используют возможности настройки ICU, описанные выше. Например:
CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false); CREATE COLLATION ignore_accents (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = false);
Все стандартные и предопределенные правила сортировки являются детерминированными; все пользовательские правила сортировки являются детерминированными по умолчанию. Хотя недетерминированные правила сортировки обеспечивают более «корректное» поведение, особенно с учетом всех возможностей Юникода и его многочисленных особых случаев, они также имеют некоторые недостатки. Прежде всего, их использование приводит к снижению производительности. В частности, следует отметить, что B-дерево не может использовать дедупликацию в индексах, использующих недетерминированные правила сортировки. Кроме того, некоторые операции невозможны с недетерминированными правилами сортировки, например, такие как сопоставление с образцом. Следовательно, их следует использовать только в тех случаях, когда это специально требуется.
Для работы с текстом в различных формах нормализации Юникода также можно использовать функции/выражения
normalize и is normalized для предварительной обработки или проверки строк вместо использования недетерминированных правил сортировки. Каждый подход имеет свои преимущества и недостатки.
ICU предоставляет широкие возможности управления поведением сортировки посредством определения новых правил сортировки, где параметры сортировки указываются как часть языкового тега. Эти параметры позволяют адаптировать порядок сортировки под различные задачи. Например:
-- игнорирование различий в диакритических знаках и регистре CREATE COLLATION ignore_accent_case (provider = icu, deterministic = false, locale = 'und-u-ks-level1'); SELECT 'Å' = 'A' COLLATE ignore_accent_case; -- true SELECT 'z' = 'Z' COLLATE ignore_accent_case; -- true -- заглавные буквы сортируются перед строчными CREATE COLLATION upper_first (provider = icu, locale = 'und-u-kf-upper'); SELECT 'B' < 'b' COLLATE upper_first; -- true -- числовая сортировка цифр и игнорирование пунктуации CREATE COLLATION num_ignore_punct (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-kn'); SELECT 'id-45' < 'id-123' COLLATE num_ignore_punct; -- true SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true
Многие из доступных параметров описаны в Раздел 3.8.2.3.2, или см. Раздел 3.8.2.3.5 для получения более подробных сведений.
Сравнение двух строк (правила сортировки) в ICU определяется многоуровневым процессом, в котором текстовые характеристики сгруппированы по «уровням». Обработка каждого уровня управляется через настройки правил сортировки. Более высокие уровни соответствуют более специфическим текстовым характеристикам.
Таблица 3.8.1 показывает, какие различия в текстовых характеристиках считаются значимыми при определении равенства на данном уровне. Символ Юникода U+2063 является невидимым разделителем и, как видно из таблицы, игнорируется на всех уровнях сравнения ниже, чем identic.
Таблица 3.8.1. Уровни правил сортировки ICU
| Уровень | Описание | 'f' = 'f' | 'ab' = U&'a\2063b' | 'x-y' = 'x_y' | 'g' = 'G' | 'n' = 'ñ' | 'y' = 'z' |
|---|---|---|---|---|---|---|---|
| уровень 1 | Базовый символ | true | true | true | true | true | false |
| level2 | Диакритические знаки | true | true | true | true | false | false |
| уровень 3 | Регистр/варианты | true | true | true | false | false | false |
| уровень 4 | Пунктуация[a] | true | true | false | false | false | false |
| identic | Все | true | false | false | false | false | false |
[a] только при наличии
| |||||||
На каждом уровне, даже если полная нормализация отключена, выполняется базовая нормализация. Например, 'á' может состоять из кодовых точек U&'\0061\0301' или одну кодовую
точку U&'\00E1', и такие последовательности будут
считаться равными даже на identic уровне. Чтобы любые различия в представлении кодовых точек считались значимыми, используйте правила сортировки, созданные с параметром детерминированными , установленным в
true.
CREATE COLLATION level3 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level3'); CREATE COLLATION level4 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level4'); CREATE COLLATION identic (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-identic'); -- невидимый разделитель игнорируется на всех уровнях, кроме identic SELECT 'ab' = U&'a\2063b' COLLATE level4; -- true SELECT 'ab' = U&'a\2063b' COLLATE identic; -- ложь -- пунктуация игнорируется на уровне 3, но не на уровне 4 SELECT 'x-y' = 'x_y' COLLATE level3; -- истина SELECT 'x-y' = 'x_y' COLLATE level4; -- ложь
Таблица 3.8.2 отображает доступные параметры правил сортировки, которые могут быть использованы в составе языкового тега для настройки правил сортировки.
Таблица 3.8.2. Настройки правил сортировки ICU
| Ключ | Значения | По умолчанию | Описание |
|---|---|---|---|
co | emoji, phonebk, standard, ... | standard | Тип правил сортировки. См. Раздел 3.8.2.3.5 для получения дополнительных параметров и подробностей. |
ka | noignore, shifted | noignore |
Если установлено значение shifted, приводит к тому, что некоторые символы
(например, пунктуация или пробел) игнорируются при сравнении. Параметр
ks должен иметь значение уровень 3 или
ниже для вступления в силу. Установите параметр kv для управления тем, какие именно
классы символов будут игнорироваться.
|
kb | true, false | false |
Обратное сравнение для различий второго уровня (level 2). Например,
локаль und-u-kb сортирует 'àe'
перед 'aé'.
|
kc | true, false | false |
Выделяет регистр в отдельный «уровень 2.5», находящийся между диакритическими знаками и другие функции уровня 3.
Если установлено значение |
kf |
upper, lower,
false
| false |
Если установлено значение upper, верхний регистр располагается перед нижним
регистром. Если параметр установлен в lower, нижний регистр располагается перед
верхним регистром. Если параметр установлен в false, порядок сортировки определяется
правилами локали.
|
kn | true, false | false |
Если установлено значение true, числа внутри строки
рассматриваются как единое числовое значение, а не как последовательность
цифр. Например, 'id-45' располагается перед
'id-123'.
|
kk | true, false | false |
Включить полную нормализацию; может повлиять на производительность. Базовая
нормализация выполняется даже при значении
Полная нормализация важна в ряде случаев, например, когда
к одному символу применяется несколько диакритических знаков. Например,
последовательности кодовых позиций |
kr |
space, punct,
symbol, currency,
digit, script-id
|
Укажите одно или несколько допустимых значений или любой идентификатор BCP 47
Переопределяет порядок следования классов символов; символы,
относящиеся к классу, указанному в списке раньше, сортируются перед символами,
относящимися к классу, указанному в списке позже. Например, значение
| |
ks | уровень 1, level2, уровень 3, уровень 4, identic | уровень 3 |
Чувствительность (или «сила») при определении равенства, где
уровень 1 наименее чувствителен к различиям, а
identic наиболее чувствителен к различиям. См.
Таблица 3.8.1 для получения подробных сведений.
|
kv |
space, punct,
symbol, currency
| punct |
Классы символов, игнорируемые при сравнении на уровне 3. Установка
более позднего значения включает в себя предыдущие значения;
например, symbol также включает
punct и space в число
игнорируемых символов. Ключ ka должен иметь значение
shifted а ключ ks должен быть задан
в значение уровень 3 или ниже, чтобы изменения вступили в силу.
|
Значения по умолчанию могут зависеть от выбранной локали. Приведенная выше таблица не является исчерпывающей. См. Раздел 3.8.2.3.5 для получения дополнительных параметров и подробных сведений.
Для использования многих параметров правил сортировки необходимо создавать объект правил сортировки с
детерминированными установленным в false для обеспечения желаемого эффекта (см. Раздел 3.8.2.2.4). Кроме того, некоторые параметры
вступают в силу только в том случае, если ключ ka имеет значение
shifted (см. Таблица 3.8.2).
CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de-u-co-phonebk'); #Немецкие правила сортировки с типом «телефонная книга»
CREATE COLLATION "und-u-co-emoji-x-icu" (provider = icu, locale = 'und-u-co-emoji'); #Корневые правила сортировки с поддержкой Emoji, согласно техническому стандарту Юникод №51
CREATE COLLATION latinlast (provider = icu, locale = 'en-u-kr-grek-latn'); #Выполнять сортировку греческих букв перед латинскими. (По умолчанию латинские буквы располагаются перед греческими.)
CREATE COLLATION upperfirst (provider = icu, locale = 'en-u-kf-upper'); #Сортировать заглавные буквы перед строчными. (По умолчанию сначала следуют строчные буквы.)
CREATE COLLATION special (provider = icu, locale = 'en-u-kf-upper-kr-grek-latn'); #Объединяет оба указанных выше параметра.
Если возможностей, предоставляемых вышеуказанными настройками правил сортировки, недостаточно, порядок элементов сортировки можно изменить с помощью правил адаптации, синтаксис которых подробно описан по адресу https://unicode-org.github.io/icu/userguide/collation/customization/.
В данном примере создаются правила сортировки на основе корневой локали с использованием правила адаптации:
CREATE COLLATION custom (provider = icu, locale = 'und', rules = '&V << w <<< W');
При использовании этого правила буква «W» сортируется после «V», однако это рассматривается как вторичное различие, подобное диакритическим знакам. Подобные правила содержатся в определениях локалей некоторых языков. (Разумеется, если определение локали уже содержит необходимые правила, их не требуется указывать повторно в явном виде.)
Ниже приведен более сложный пример. Следующий оператор определяет правила сортировки с именем ebcdic с правилами сортировки символов US-ASCII в порядке, соответствующем кодировке EBCDIC.
CREATE COLLATION ebcdic (provider = icu, locale = 'und',
rules = $$
& ' ' < '.' < '<' < '(' < '+' < \|
< '&' < '!' < '$' < '*' < ')' < ';'
< '-' < '/' < ',' < '%' < '_' < '>' < '?'
< '`' < ':' < '#' < '@' < \' < '=' < '"'
<*a-r < '~' <*s-z < '^' < '[' < ']'
< '{' <*A-I < '}' <*J-R < '\' <*S-Z <*0-9
$$);
SELECT c
FROM (VALUES ('a'), ('b'), ('A'), ('B'), ('1'), ('2'), ('!'), ('^')) AS x(c)
ORDER BY c COLLATE ebcdic;
c
---
!
a
b
^
A
B
1
2
Данный раздел (Раздел 3.8.2.3) содержит лишь краткий обзор принципов работы ICU и языковых тегов. Для получения подробных технических сведений, информации о дополнительных параметрах и новых функциях обратитесь к следующим документам: