postgresql - postgresql 11 - 使用 ICU 语言环境创建数据库
问题描述
我想使用 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' 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".
注意:一个相关的问题,Linux 上的 PostgreSQL 10 - LC_COLLATE locale en_US.utf-8 not valid似乎并不那么相关,因为答案谈到了生成操作系统级别的语言环境来解决问题。据我所知,ICU 语言环境是明确打算与底层操作系统分开的。
解决方案
推荐阅读
- javascript - 猫鼬在 ref 字段中添加更多键:值
- python - 如何将一个列表中的元素添加到另一个列表中?
- bash - 测量固定宽度输出中的字段/列宽 - 查找分隔符?
- javascript - 当反应应用程序未在 localhost:3000 上加载时,如何设置 webpack 和 babel
- javascript - URL 条件 Wordpress 小部件按钮
- assembly - mov 命令上的内存偏移
- python - 从行中删除一些部分
- python - 运行 /usr/bin/python3 -m pip install cImage 后 pycharm 中未解析的引用“cImage”
- llvm - 基本编译的 LLVM-IR 导致分段错误
- python - Python pandas:滚动总和不会产生 12 个月的总和