Я хочу использовать сортировку, не зависящую от системы 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, насколько я понимаю, специально предназначены для отделения от базовой ОС.