CREATE COLLATION
CREATE COLLATION — создать правило сортировки
Синтаксис
CREATE COLLATION [ IF NOT EXISTS ]имя( [ LOCALE =локаль, ] [ LC_COLLATE =категория_сортировки, ] [ LC_CTYPE =категория_типов_символов, ] [ PROVIDER =провайдер, ] [ DETERMINISTIC =boolean, ] [ RULES =правила, ] [ VERSION =версия] ) CREATE COLLATION [ IF NOT EXISTS ]имяFROMсуществующее_правило
Описание #
CREATE COLLATION определяет новое правило сортировки, используя параметры локали операционной системы, либо копируя существующее правило.
Чтобы создать правило сортировки, необходимо иметь право CREATE в целевой схеме.
Параметры
IF NOT EXISTSНе считать ошибкой, если правило сортировки с таким именем уже существует. В этом случае будет выдано замечание. Заметьте, что нет никакой гарантии, что существующее правило сортировки как-то соотносится с тем, которое могло бы быть создано.
имяИмя правила сортировки, возможно, дополненное схемой. Если схема не указана, правило сортировки создаётся в текущей схеме. Заданное имя правила должно быть уникальным в этой схеме. (Системные каталоги могут содержать правила сортировки с одним именем, но предназначенные для разных кодировок, однако они будут игнорироваться, если их кодировка не совпадает с кодировкой базы данных.)
локальИмя локали для правила сортировки. За подробностями обратитесь к Подразделу 23.2.2.3.1 и Подразделу 23.2.2.3.2.
Если указан
провайдерlibc, это краткая запись для одновременной установкиLC_COLLATEиLC_CTYPE. Если указаналокаль, задать любой из этих параметров отдельно нельзя.Если указан
провайдерbuiltin, должна быть указаналокальсо значениемC,C.UTF-8илиPG_UNICODE_FAST.категория_сортировкиЕсли указан
провайдерlibc, указанная локаль операционной системы устанавливается в качестве категории локалиLC_COLLATE.категория_типов_символовЕсли указан
провайдерlibc, указанная локаль операционной системы устанавливается в качестве категории локалиLC_CTYPE.провайдерЗадаёт провайдер, который будет использоваться для функций локализации, связанных с данным правилом сортировки. Возможные значения:
builtin,icu(если сервер собран с поддержкой ICU) илиlibc. По умолчанию выбираетсяlibc. За подробностями обратитесь к Подразделу 23.1.4.DETERMINISTICОпределяет, будет ли правило сортировки использовать детерминированное сравнение. По умолчанию выбирается именно такое сравнение. При детерминированном сравнении строки, состоящие из различных байтов, считаются неравными, даже если на логическом уровне они одинаковы. Postgres Pro решает вопрос их равенства, сравнивая их по байтам. Если же для правила сортировки выбрать недетерминированное сравнение, это правило может стать, например, независящим от ударения или регистра символов. Для этого необходимо выбрать подходящее значение
LOCALEи сделать это правило сортировки недетерминированным.Недетерминированные правила сортировки поддерживаются только с провайдером ICU.
правилаУказывает дополнительные правила для настройки поведения сортировки. Параметр поддерживается только для ICU. За дополнительной информацией обратитесь к Подразделу 23.2.3.4.
версияЗадаёт строку версии, сохраняемую с правилом сортировки. Обычно её не следует задавать — тогда эта версия будет получена из фактической версии правила сортировки, сообщённой операционной системой. Это указание предназначено для того, чтобы команда
pg_upgradeсмогла скопировать версию из существующей инсталляции.Что делать при несовпадении версий правил сортировки, описано в ALTER COLLATION.
существующее_правилоИмя копируемого существующего правила сортировки. Новое правило сортировки получит те же свойства, что и существующее, но будет независимым объектом.
Примечания #
Команда CREATE COLLATION устанавливает блокировку SHARE ROW EXCLUSIVE в системном каталоге pg_collation. Эта блокировка конфликтует с такой же, поэтому в один момент времени может выполняться только одна команда CREATE COLLATION.
Для удаления созданных пользователем правил сортировки применяется команда DROP COLLATION.
Подробнее узнать о создании правил сортировки можно в Подразделе 23.2.2.3.
Когда используется провайдер libc, локаль должна быть применимой к кодировке текущей базы данных. Точные правила описаны в CREATE DATABASE.
Примеры #
Создание правила сортировки из локали операционной системы ru_RU.utf8 (предполагается, что кодировка текущей базы данных — UTF-8):
CREATE COLLATION russian (locale = 'ru_RU.utf8');
Создание правила сортировки с порядком, при котором латинские буквы идут перед буквами кириллицы, с использованием провайдера ICU:
CREATE COLLATION latn_cyrl (provider = icu, locale = 'ru-RU-u-kr-latn-cyrl');
Создание правила сортировки с пользовательскими условиями с использованием провайдера ICU на основе корневой локали ICU:
CREATE COLLATION custom (provider = icu, locale = 'und', rules = '&V << w <<< W');
За дополнительной информацией и примерами синтаксиса правил обратитесь к Подразделу 23.2.3.4.
Создание правила сортировки из уже существующего:
CREATE COLLATION german FROM "de_DE";
Иногда удобно использовать в приложениях имена правил сортировки, не зависящие от операционной системы.
Совместимость #
Оператор CREATE COLLATION определён в стандарте SQL, но его действие ограничено копированием существующего правила сортировки. Синтаксис создания нового правила сортировки представляет собой расширение Postgres Pro.
См. также #
ALTER COLLATION, DROP COLLATIONCREATE COLLATION
CREATE COLLATION — define a new collation
Synopsis
CREATE COLLATION [ IF NOT EXISTS ]name( [ LOCALE =locale, ] [ LC_COLLATE =lc_collate, ] [ LC_CTYPE =lc_ctype, ] [ PROVIDER =provider, ] [ DETERMINISTIC =boolean, ] [ RULES =rules, ] [ VERSION =version] ) CREATE COLLATION [ IF NOT EXISTS ]nameFROMexisting_collation
Description #
CREATE COLLATION defines a new collation using the specified operating system locale settings, or by copying an existing collation.
To be able to create a collation, you must have CREATE privilege on the destination schema.
Parameters
IF NOT EXISTSDo not throw an error if a collation with the same name already exists. A notice is issued in this case. Note that there is no guarantee that the existing collation is anything like the one that would have been created.
nameThe name of the collation. The collation name can be schema-qualified. If it is not, the collation is defined in the current schema. The collation name must be unique within that schema. (The system catalogs can contain collations with the same name for other encodings, but these are ignored if the database encoding does not match.)
localeThe locale name for this collation. See Section 23.2.2.3.1 and Section 23.2.2.3.2 for details.
If
providerislibc, this is a shortcut for settingLC_COLLATEandLC_CTYPEat once. If you specifylocale, you cannot specify either of those parameters.If
providerisbuiltin, thenlocalemust be specified and set to eitherC,C.UTF-8orPG_UNICODE_FAST.lc_collateIf
providerislibc, use the specified operating system locale for theLC_COLLATElocale category.lc_ctypeIf
providerislibc, use the specified operating system locale for theLC_CTYPElocale category.providerSpecifies the provider to use for locale services associated with this collation. Possible values are
builtin,icu(if the server was built with ICU support) orlibc.libcis the default. See Section 23.1.4 for details.DETERMINISTICSpecifies whether the collation should use deterministic comparisons. The default is true. A deterministic comparison considers strings that are not byte-wise equal to be unequal even if they are considered logically equal by the comparison. Postgres Pro breaks ties using a byte-wise comparison. Comparison that is not deterministic can make the collation be, say, case- or accent-insensitive. For that, you need to choose an appropriate
LOCALEsetting and set the collation to not deterministic here.Nondeterministic collations are only supported with the ICU provider.
rulesSpecifies additional collation rules to customize the behavior of the collation. This is supported for ICU only. See Section 23.2.3.4 for details.
versionSpecifies the version string to store with the collation. Normally, this should be omitted, which will cause the version to be computed from the actual version of the collation as provided by the operating system. This option is intended to be used by
pg_upgradefor copying the version from an existing installation.See also ALTER COLLATION for how to handle collation version mismatches.
existing_collationThe name of an existing collation to copy. The new collation will have the same properties as the existing one, but it will be an independent object.
Notes #
CREATE COLLATION takes a SHARE ROW EXCLUSIVE lock, which is self-conflicting, on the pg_collation system catalog, so only one CREATE COLLATION command can run at a time.
Use DROP COLLATION to remove user-defined collations.
See Section 23.2.2.3 for more information on how to create collations.
When using the libc collation provider, the locale must be applicable to the current database encoding. See CREATE DATABASE for the precise rules.
Examples #
To create a collation from the operating system locale ru_RU.utf8 (assuming the current database encoding is UTF8):
CREATE COLLATION russian (locale = 'ru_RU.utf8');
To create a collation using the ICU provider where Latin characters precede Cyrillic ones:
CREATE COLLATION latn_cyrl (provider = icu, locale = 'ru-RU-u-kr-latn-cyrl');
To create a collation using the ICU provider, based on the root ICU locale, with custom rules:
CREATE COLLATION custom (provider = icu, locale = 'und', rules = '&V << w <<< W');
See Section 23.2.3.4 for further details and examples on the rules syntax.
To create a collation from an existing collation:
CREATE COLLATION german FROM "de_DE";
This can be convenient to be able to use operating-system-independent collation names in applications.
Compatibility #
There is a CREATE COLLATION statement in the SQL standard, but it is limited to copying an existing collation. The syntax to create a new collation is a Postgres Pro extension.