postgresql 11 - 使用 ICU 语言环境创建数据库

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;

我似乎已经有了所需的 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)
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 区域设置明确旨在与底层操作系统分离。

Lau*_*lbe 3

从 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 库用于排序规则。