在 Postgres 10 中将 ICU 排序规则指定为 `ENCODING`、`LC_COLLATE` 和 `LC_CTYPE`

Bas*_*que 6 postgresql collation postgresql-10 international-components-unicode

Postgres 10 获得了使用国际组件进行 Unicode (ICU)排序的能力,而不是依赖于主机操作系统的实现。请参阅Peter Eisentraut在 PostgreSQL 10 中使用 ICU 支持的更强大的排序规则。

那么在创建数据库时究竟如何指定 ICU 排序规则呢?

我确实在CREATE DATABASEto use 中阅读了一个提示,template0而不是template1iftemplate1可能是使用编码和整理而不是您想要的新数据库创建的。并且在使用时template0,您需要启用数据连接以覆盖默认值。

我在 Postgres 10 doc page for Collat​​ion Support中读到:

und-x-icu(用于“未定义”)

ICU“根”整理。使用它来获得合理的与语言无关的排序顺序。

因此,und-x-icu在建立包含多语言文本的新数据库时,这似乎是一个很好的使用价值。当已知某种语言专注于特定语言时,该SELECT命令可以指定另一种排序规则,例如 German de-x-icu。否则,回退到默认值und-x-icu

所以我尝试了以下 SQL 在 Postgres 10 Beta 2 中创建一个数据库。

CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu'
LC_CTYPE 'und-x-icu'
;
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

[42809] 错误:无效的语言环境名称:“und-x-icu”

所以我坚持在.utf8文档中看到的老式排序规则语法的附加。

CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu.utf8'
LC_CTYPE 'und-x-icu.utf8'
;
Run Code Online (Sandbox Code Playgroud)

同样失败:

[42809] 错误:无效的语言环境名称:“und-x-icu.utf8”

我的 Postgres 集群是用 ICU 库构建的吗?这是调用的结果pg_config。最后一行是'ICU_LIBS=-L/opt/local/Current/lib -licuuc -licudata -licui18n'。我想这意味着我的构建包含 ICU 库,但我不确定。

/Library/PostgreSQL/10Beta2/bin/pg_config --configure

'--with-icu' '--prefix=/mnt/hgfs/pginstaller.pune/server/staging_cache/osx' '--with-ldap' '--with-openssl' '--with-perl' '- -with-python' '--with-tcl' '--with-bonjour' '--with-pam' '--enable-thread-safety' '--with-libxml' '--with-uuid=e2fs ''--with-includes=/opt/local/Current/include/libxml2:/opt/local/Current/include:/opt/local/Current/include/security''--docdir=/mnt/hgfs/pginstaller .pune/server/staging_cache/osx/doc/postgresql' '--with-libxslt' '--with-libedit-preferred' '--with-gssapi' 'CFLAGS=-isysroot /Applications/Xcode.app/Contents/ Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -mmacosx-version-min=10.8 -arch i386 -arch x86_64 -O2' 'LDFLAGS=-L/opt/local/Current/lib' 'ICU_CFLAGS=-I/opt/local/Current/include' 'ICU_LIBS=-L/opt/local/Current/lib -licuuc -licudata -licui18n'

? 怎样才能指定ENCODINGLC_COLLATE以及LC_TYPE使用新的排序规则ICU?

? 您会为面向英语的数据库建议哪些 ICU 排序规则名称?对于西欧多语言数据库?

? 可能的 ICU 归类名称是什么?

Dan*_*ité 4

首先让我们注意,在回答这个问题时,PostgreSQL 10 仍处于测试阶段。有关 ICU 集成及其记录方式的一些问题仍在讨论中,并且在 GA 发布之前可能会有更改。

\n\n
\n

\xe2\x9e\xa0 如何指定 ENCODING、LC_COLLATE 和 LC_TYPE 以使用新的 ICU 排序规则?

\n
\n\n

目前这是不可能的(并且可能记录得不够好,或者错误消息中不够清楚:当它说invalid locale name时,它​​意味着来自 提供的区域设置集libc)。
\n开发人员邮件列表上的这个线程对此进行了讨论:\n ICU 可以用于数据库的默认排序顺序吗?

\n\n
\n

\xe2\x9e\xa0 对于面向英语的数据库,您建议采用什么 ICU 排序规则名称?对于西欧多语言数据库?

\n
\n\n

如果您有特定的排序要求,这最重要。在邮件列表的另一个线程中:
\n用户可以在 Postgres 中使用自定义 ICU 排序规则做什么 \n10
\n给出一些具体示例,说明 ICU 排序规则的行为与 libc 的功能相比具有特殊性。

\n\n

当没有特定要求时,我认为大多数应用程序不会关心它们是使用 ICU 排序规则还是 libcen_US排序规则,除了可移植性。的一大要点ICU是在给定区域设置的所有操作系统中获得完全相同的排序,而libc. 我想预先创建的排序规则en-x-icu对于一般英语来说很好,对于西欧语言,我不确定为什么任何排序规则都会比und-x-icu.

\n\n

顺便说一句,除非C您真正关心排序规则,否则使用任何其他排序规则都不是一个好主意,因为C作为排序规则将优于任何语言感知排序规则。并且C可以跨操作系统移植。

\n\n
\n

\xe2\x9e\xa0 可能的 ICU 排序规则名称是什么?

\n
\n\n

尽管initdb填充了pg_collation预定义排序规则列表,但完整列表可能会出现组合爆炸,\nas ICU 排序规则名称是通过组装标签形成的,如下所列:\n http://unicode.org/reports/tr35/ tr35-collat​​ion.html#Setting_Options

\n\n

目前该文档没有明确提到您可以执行以下操作:

\n\n
CREATE COLLATION mycoll (locale=\'my-set-of-tags\', provider=\'icu\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我认为现在正在开展工作以改进文档中的内容。

\n\n

另一个可能值得指出的问题是,存在多个 ICU 主要版本,并且实例化的预定义排序规则列表initdb在这些版本之间存在显着差异,尤其是 ICU 53 之前与 53 之后。这已在另一次讨论中得到证实:\n某些 ICU-52 (debian8) COLLATE 和 work_mem 值的崩溃报告

\n\n

编辑:在下一个 beta 或 RC 中,由 initdb 创建的 ICU 排序规则列表将彻底改变,如本讨论中所述。该列表将通过迭代 ICU 区域设置而不是排序规则来创建,因此会出现“可能的 ICU 排序规则名称是什么?”的问题。必须根据新的价值观重新考虑。

\n