22.2. Поддержка правил сортировки#
22.2. Поддержка правил сортировки #
Функция правил сортировки позволяет указывать порядок сортировки и поведение классификации символов данных для каждого столбца или даже для каждой операции. Это позволяет обойти ограничение, что настройки LC_COLLATE
и LC_CTYPE
базы данных не могут быть изменены после ее создания.
22.2.1. Концепции #
Концептуально, у каждого выражения сортируемых типов данных, есть правило сортировки. (Встроенные типы данных, которые могут быть упорядочены, это text
, varchar
и char
. Пользовательские базовые типы также могут быть помечены как упорядочиваемые, и, конечно же, домен над упорядочиваемым типом данных также является упорядочиваемым). Если выражение является ссылкой на столбец, правило сортировки выражения - это определенное правило сортировки столбца. Если выражение является константой, правило сортировки - это правило сортировки по умолчанию для типа данных константы. Правило сортировки более сложного выражения основывается на правилах сортировки его входных данных, как описано ниже.
Правило сортировки выражения может быть правилом сортировки “по умолчанию”, что означает настройки локали, определенные для базы данных. Также возможно, что правило сортировки выражения будет неопределенным. В таких случаях операции сортировки и другие операции, которым необходимо знать правило сортировки, завершатся с ошибкой.
Когда система базы данных должна выполнить упорядочение или классификацию символов, она использует правило сортировки входного выражения. Это происходит, например, с помощью предложений 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
,
потому что выражение объединяет неявно производное правило сортировки с правилом сортировки по умолчанию. Но в
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";
22.2.2. Управление правилами сортировками #
Правило сортировки - это объект схемы SQL, который сопоставляет SQL-имя с локалями, предоставляемыми библиотеками, установленными в операционной системе. Определение правила сортировки имеет провайдера, который указывает, какая библиотека предоставляет данные о локали. Одним из стандартных имен провайдера является libc
, который использует локали, предоставляемые библиотекой C операционной системы. Это локали, используемые большинством инструментов, предоставляемых операционной системой. Другим провайдером является icu
, который использует внешнюю библиотеку ICU
библиотека. Локали ICU могут быть использованы только в том случае, если поддержка ICU была настроена при сборке PostgreSQL.
Объект правила сортировки, предоставляемый библиотекой libc
, соответствует комбинации настроек LC_COLLATE
и LC_CTYPE
, принимаемых функцией setlocale()
системной библиотеки. (Как следует из названия, основная цель правила сортировки - установка значения LC_COLLATE
, которое контролирует порядок сортировки. Однако на практике редко требуется, чтобы значение LC_CTYPE
отличалось от значения LC_COLLATE
, поэтому удобнее объединить их в одно понятие, чем создавать отдельную инфраструктуру для установки значения LC_CTYPE
для каждого выражения). Кроме того, правило сортировки библиотеки libc
связано с кодировкой набора символов (см. Раздел 22.3). Одинаковое имя правила сортировки может существовать для разных кодировок.
Объект правила сортировки, предоставляемый icu
, соответствует именованному
провайдеру, предоставляемому библиотекой ICU. ICU не поддерживает
отдельные настройки “collate” и “ctype”, поэтому
они всегда одинаковы. Кроме того, правило сортировки ICU не зависит от
кодировки, поэтому в базе данных всегда есть только одно правило ICU с заданным именем.
22.2.2.1. Стандартные правила сортировки #
На всех платформах доступны правила сортировки с именами default
, C
и POSIX
. Дополнительные правила сортировки могут быть доступны в зависимости от поддержки операционной системы. правило сортировки default
выбирает значения LC_COLLATE
и LC_CTYPE
, указанные при создании базы данных. Правила сортировки C
и POSIX
оба определяют поведение “традиционного C”, в котором только буквы ASCII “A
” до “Z
” считаются буквами, а сортировка выполняется строго по значениям байтов символов.
Примечание
C
и POSIX
локали могут вести себя
по-разному в зависимости от кодировки базы данных.
Кроме того, доступны два имени стандартного правила сортировки SQL:
unicode
Это правило сортировки использует алгоритм сортировки Юникода с таблицей элементов сортировки Юникода по умолчанию. Она доступна во всех кодировках. Для использования этой сортировки требуется поддержка ICU. (Это правило сортировки работает также, как и корневая локаль ICU; см.
und-x-icu
(for “undefined”).)ucs_basic
Эта сортировка выполняется по коду Unicode. Она доступна только для кодировки
UTF8
. (Это правило сортировки работает также, как и спецификация локали libcC
в кодировкеUTF8
.)
22.2.2.2. Предопределенные правила сортировки #
Если операционная система поддерживает использование нескольких локалей в рамках одной программы (функции newlocale
и связанные с ними функции), или если поддержка ICU настроена, то при инициализации кластера базы данных команда initdb
заполняет системный каталог pg_collation
правилами сортировки, основанными на всех локалях, найденных в операционной системе на момент инициализации.
Для проверки доступных в настоящее время локалей используйте запрос SELECT * FROM pg_collation
или команду \dOS+
в psql.
22.2.2.2.1. Правила сортировки libc #
Например, операционная система может предоставить локаль с именем 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()
.
В пределах конкретной базы данных интерес представляют только правила сортировки, использующие кодировку этой базы данных. Другие записи в pg_collation
игнорируются. Таким образом, усеченное имя правила сортировки, такое как de_DE
, может считаться уникальным в пределах данной базы данных, хотя оно не будет уникальным глобально. Рекомендуется использовать обрезанные имена сортировок, так как это позволит избежать изменений при смене кодировки базы данных. Однако следует отметить, что правила сортировки default
, C
и POSIX
могут использоваться независимо от кодировки базы данных.
Tantor BE считает различные объекты правила сортировки несовместимыми, даже если они имеют идентичные свойства. Таким образом, например,
SELECT a COLLATE "C" < b COLLATE "POSIX" FROM test1;
выдаст ошибку, даже если правила сортировки C
и POSIX
имеют идентичное поведение. Поэтому не рекомендуется смешивать
усеченные и полные имена сортировок.
22.2.2.2.2. Правила сортировки ICU #
С использованием ICU нет смысла перечислять все возможные имена локалей. ICU использует определенную систему именования для локалей, но существует гораздо больше способов назвать локаль, чем на самом деле существует отдельных локалей. Команда initdb
использует API ICU для извлечения набора отдельных локалей для заполнения начального набора правил сортировки. Правила сортировки, предоставляемые ICU, создаются в среде SQL с именами в формате языкового тега BCP 47, с добавлением расширения “private use” -x-icu
, чтобы отличать их от локалей libc.
Вот несколько примеров правил сортировки, которые могут быть созданы:
de-x-icu
#Немецкое правило сортировки, вариант по умолчанию
de-AT-x-icu
#Немецкое правило сортировки для Австрии, вариант по умолчанию
(Также есть, скажем,
de-DE-x-icu
илиde-CH-x-icu
, но на момент написания этого, они эквивалентныde-x-icu
).und-x-icu
(for “undefined”) #ICU “корневое” правило сортировки. Используйте это для получения разумного языконезависимого порядка сортировки.
Некоторые (реже используемые) кодировки не поддерживаются ICU. Когда кодировка базы данных относится к таким кодировкам, записи правила сортировки ICU в pg_collation
игнорируются. Попытка использовать одну из них вызовет ошибку вроде “правило сортировки "de-x-icu" для кодировки "WIN874" не существует”.
22.2.2.3. Создание новых объектов правил сортировки #
Если стандартные и предопределенные правила сортировки недостаточны, пользователи могут создать свои собственные объекты сортировки с помощью SQL-команды CREATE COLLATION.
Стандартные и предопределенные правила сортировки находятся в схеме pg_catalog
, как и все предопределенные объекты.
Пользовательские правила сортировки следует создавать в пользовательских схемах. Это также гарантирует, что они будут сохранены с помощью pg_dump
.
22.2.2.3.1. Правила сортировки libc #
Новые правила сортировки libc могут быть созданы следующим образом:
CREATE COLLATION german (provider = libc, locale = 'de_DE');
Точные значения, которые допустимы для параметра locale
в этой команде, зависят от операционной системы. На подобных Unix-подобных
системах команда locale -a
покажет список.
С тех пор как предопределенные правила сортировки libc уже включают все правила сортировки, определенные в операционной системе при инициализации экземпляра базы данных, редко бывает необходимость вручную создавать новые. Причины могут быть следующими: если требуется использовать другую систему именования (в этом случае см. также Раздел 22.2.2.3.3), или если операционная система была обновлена для предоставления новых определений локалей (в этом случае см. также pg_import_system_collations()
).
22.2.2.3.2. Правила сортировки ICU #
Правила сортировки ICU могут быть созданы как:
CREATE COLLATION german (provider = icu, locale = 'de-DE');
ICU локали указываются как BCP 47 Языковой Тег, но также могут принимать большинство имен локалей в стиле libc. Если возможно, имена локалей в стиле libc преобразуются в языковые теги.
Новые правила сортировки ICU могут значительно настраивать поведение сортировки, включая атрибуты сортировки в языковом теге. См. Раздел 22.2.3 для подробностей и примеров.
22.2.2.3.3. Копирование правил сортировки #
Команда CREATE COLLATION также может использоваться для создания нового правила сортировки на основе существующего правила сортировки, что может быть полезно для использования независимых от операционной системы имен правил сортировки в приложениях, создания совместимых имен или использования правила сортировки, предоставленного ICU, под более понятным именем. Например:
CREATE COLLATION german FROM "de_DE"; CREATE COLLATION french FROM "fr-x-icu";
22.2.2.4. Недетерминированные правила сортировки #
Правило сортировки может быть либо детерминированной, либо недетерминированной. Детерминированное правило сортировки использует детерминированные сравнения, что означает, что строки считаются равными только в том случае, если они состоят из одинаковой последовательности байтов. Недетерминированное сравнение может считать строки равными даже если они состоят из разных байтов. Типичные ситуации включают сравнение без учета регистра, сравнение без учета акцентов, а также сравнение строк в разных нормальных формах Юникода. Фактическая реализация таких сравнений без учета регистра зависит от провайдера правила сортировки; флаг детерминированности определяет только то, как разрешаются равные значения с помощью сравнения по байтам. См. также Технический стандарт Юникода 10 для получения дополнительной информации о терминологии.
Для создания недетерминированного правила сортировки укажите свойство deterministic = false
в команде CREATE COLLATION
, например:
CREATE COLLATION ndcoll (provider = icu, locale = 'und', deterministic = false);
Этот пример будет использовать стандартное универсальное правило сортировки Unicode в недетерминированном режиме. В частности, это позволит правильно сравнивать строки разных нормализованных форм. Более интересные примеры используют возможности настройки 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-дерево не может использовать дедупликацию с индексами, использующими недетерминированное правило сортировки. Также некоторые операции невозможны с недетерминированными правилами сортировки, такие как операции сопоставления шаблонов. Поэтому их следует использовать только в тех случаях, когда они явно требуются.
Подсказка
Для работы с текстом в различных формах нормализации Unicode также есть возможность использовать функции/выражения normalize
и is normalized
для предварительной обработки или проверки строк вместо использования недетерминированных правил сортировки. Каждый подход имеет свои преимущества и недостатки.
22.2.3. Пользовательские правила сортировки ICU #
ICU позволяет осуществлять расширенный контроль над поведением сортировки, определяя новые правила сортировки с настройками сортировки как часть языкового тега. Эти настройки могут изменять порядок сортировки в соответствии с различными потребностями. Например:
-- ignore differences in accents and case 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 -- upper case letters sort before lower case. CREATE COLLATION upper_first (provider = icu, locale = 'und-u-kf-upper'); SELECT 'B' < 'b' COLLATE upper_first; -- true -- treat digits numerically and ignore punctuation 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
Многие из доступных опций описаны в Раздел 22.2.3.2, или см. Раздел 22.2.3.5 для получения более подробной информации.
22.2.3.1. Уровни сравнения ICU #
Сравнение двух строк (сортировка) в ICU определяется многоуровневым процессом, где текстовые особенности сгруппированы в "уровни". Обработка каждого уровня контролируется настройками сортировки. Более высокие уровни соответствуют более тонким текстовым особенностям.
Таблица 22.1 показывает, какие различия в текстовых характеристиках считаются значительными при определении равенства на данном уровне. Символ Unicode U+2063
является невидимым разделителем и, как видно из таблицы, игнорируется на всех уровнях сравнения ниже identic
.
Таблица 22.1. Уровни сортировки ICU
Уровень | Описание | 'f' = 'f' | 'ab' = U&'a\2063b' | 'x-y' = 'x_y' | 'g' = 'G' | 'n' = 'ñ' | 'y' = 'z' |
---|---|---|---|---|---|---|---|
уровень1 | Базовый символ | true | true | true | true | true | false |
уровень2 | Акценты | true | true | true | true | false | false |
уровень3 | Регистр/Варианты | true | true | true | false | false | false |
уровень4 | Пунктуация | true | true | false | false | false | false |
идентичный | Все | true | false | false | false | false | false |
На каждом уровне, даже при полной отключенной нормализации, выполняется
базовая нормализация. Например, 'á'
может состоять из
кодовых точек U&'\0061\0301'
или одной кодовой
точки U&'\00E1'
, и эти последовательности будут
считаться равными даже на уровне identic
. Чтобы
рассматривать любое различие в представлении кодовых точек как различное,
используйте сортировку, созданную с deterministic
, установленным в
true
.
22.2.3.1.1. Примеры Уровня Сортировки #
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'); -- invisible separator ignored at all levels except identic SELECT 'ab' = U&'a\2063b' COLLATE level4; -- true SELECT 'ab' = U&'a\2063b' COLLATE identic; -- false -- punctuation ignored at level3 but not at level 4 SELECT 'x-y' = 'x_y' COLLATE level3; -- true SELECT 'x-y' = 'x_y' COLLATE level4; -- false
22.2.3.2. Настройки сортировки для локали ICU #
Таблица 22.2 показывает доступные настройки сортировки, которые могут быть использованы как часть языкового тега для настройки сортировки.
Таблица 22.2. Настройки правил сортировки ICU
Ключ | Значения | По умолчанию | Описание |
---|---|---|---|
co | emoji , phonebk , standard , ... | standard | Тип сортировки. См. Раздел 22.2.3.5 для дополнительных опций и деталей. |
ka | noignore , shifted | noignore |
Если установлено значение shifted , некоторые символы
(например, знаки препинания или пробел) будут игнорироваться при сравнении. Ключ
ks должен быть установлен на level3 или
ниже, чтобы это вступило в силу. Установите ключ kv , чтобы контролировать, какие
классы символов игнорируются.
|
kb | true , false | false |
Обратное сравнение для различий уровня 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 | level1 , level2 , level3 , level4 , identic | level3 |
Чувствительность (или "сила") при определении равенства, где
level1 наименее чувствителен к различиям, а
identic наиболее чувствителен к различиям. См.
Таблица 22.1 для подробностей.
|
kv |
space , punct ,
symbol , currency
| punct |
Классы символов, игнорируемые при сравнении на уровне 3. Установка
на более позднее значение включает более ранние значения;
например, symbol также включает
punct и space в
игнорируемые символы. Ключ ka должен быть установлен
на shifted и ключ ks должен быть установлен
на level3 или ниже, чтобы вступить в силу.
|
Значения по умолчанию могут зависеть от локали. Приведенная выше таблица не является исчерпывающей. См. Раздел 22.2.3.5 для получения дополнительных параметров и подробностей.
Примечание
Для многих настроек сортировки необходимо создать правило сортировки с
deterministic
установленным в false
, чтобы
настройка имела желаемый эффект (см. Раздел 22.2.2.4). Кроме того, некоторые настройки
вступают в силу только тогда, когда ключ ka
установлен в
shifted
(см. Таблица 22.2).
22.2.3.3. Примеры настроек сортировки #
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, согласно стандарту Unicode Technical Standard #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');
#Комбинирует оба из вышеуказанных вариантов.
22.2.3.4. Правила настройки ICU #
Если параметры, предоставляемые настройками сортировки, показанными выше, не достаточны, порядок элементов сортировки можно изменить с помощью правил настройки, синтаксис которых подробно описан на 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
22.2.3.5. Внешние ссылки для ICU #
Этот раздел (Раздел 22.2.3) представляет собой лишь краткий обзор поведения ICU и языковых тегов. Обратитесь к следующим документам для технических деталей, дополнительных опций и нового поведения: