postgresql 11 - создать базу данных с локали ICU - PullRequest
2 голосов
/ 05 апреля 2020

Я хочу использовать сортировку, не зависящую от системы ICU, чтобы избежать различий в сортировке между postgres11-on-ma c и postgres11-on-Ubuntu. Мой первый тест состоял в том, чтобы выгрузить мои существующие Collate=en_US.UTF-8 и pg_restore их в базу данных, созданную с помощью Collate=en-US-x-icu

Создать базу данных do c, которая говорит:

Для создания базы данных musi c с другой локалью:

CREATE DATABASE music LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8' TEMPLATE template0;

Кажется, у меня уже есть требуемые локали icu:

select collname, collprovider from pg_collation where collname like 'en_US%';

        collname        | collprovider
------------------------+--------------
 en_US.UTF-8            | c
 en_US                  | c
 en_US.ISO8859-15       | c
 en_US.ISO8859-1        | c
 en_US                  | c
 en_US                  | c
 en-US-x-icu            | i ?
 en-US-u-va-posix-x-icu | i ?
(8 rows)

Но не повезло при создании базы данных с использованием локали icu.

CREATE DATABASE test LC_COLLATE = 'en-US-x-icu' TEMPLATE template0;
ksysdb=# CREATE DATABASE test LC_COLLATE = 'en-US-x-icu' TEMPLATE template0;
ERROR:  invalid locale name: "en-US-x-icu"

Я могу использовать LC_COLLATE с другими локалями:

Предложение LC_COLLATE, похоже, поставляется с некоторыми присоединенными строками, такими как просмотр вашей кодировки и указание соответствующего шаблона. Но, похоже, он дает подсказки об ошибках в не-ICU локалях.

Это работает, например: CREATE DATABASE test LC_COLLATE = 'en_US' TEMPLATE template0;

, и это дает полезное сообщение для пользователя:

ksysdb=# CREATE DATABASE test LC_COLLATE = 'en_US.ISO8859-15' TEMPLATE template0;
ERROR:  encoding "UTF8" does not match locale "en_US.ISO8859-15"
DETAIL:  The chosen LC_COLLATE setting requires encoding "LATIN9".

Примечание: связанный вопрос, PostgreSQL 10 для Linux - Недопустимый языковой стандарт LC_COLLATE en_US.utf-8 , не кажется таким уж актуальным, так как ответ говорит о создании OS- Уровень локали, чтобы решить проблему. Хотя локали ICU, насколько я понимаю, специально предназначены для отделения от базовой ОС.

...