JL *_*ret 6 postgresql locale collation icu postgresql-11
我想使用 ICU 系统不敏感的排序规则,以避免 postgres11-on-mac 与 postgres11-on-Ubuntu 之间的排序差异。我的第一个测试是转储现有的Collate=en_US.UTF-8并将它们 pg_restore 到使用创建的数据库中Collate=en-US-x-icu
创建数据库文档有这样的内容:
要创建具有不同语言环境的数据库音乐:
创建数据库音乐 LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8' 模板 template0;
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)
Run Code Online (Sandbox Code Playgroud)
但使用任一 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"
Run Code Online (Sandbox Code Playgroud)
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".
Run Code Online (Sandbox Code Playgroud)
注意:一个相关的问题PostgreSQL 10 on Linux - LC_COLLATE locale en_US.utf-8 not valid似乎并不那么相关,因为答案谈到了生成操作系统级别的区域设置来解决问题。据我了解,ICU 区域设置明确旨在与底层操作系统分离。
从 PostgreSQL v15 开始,这是可能的:
CREATE DATABASE test
LOCALE_PROVIDER icu
ICU_LOCALE "en-US"
LOCALE "en_US.utf8"
TEMPLATE template0;
Run Code Online (Sandbox Code Playgroud)
您仍然需要提供 libc 语言环境,但 ICU 库用于排序规则。