Bas*_*que 6 postgresql collation postgresql-10 international-components-unicode
Postgres 10 获得了使用国际组件进行 Unicode (ICU)排序的能力,而不是依赖于主机操作系统的实现。请参阅Peter Eisentraut在 PostgreSQL 10 中使用 ICU 支持的更强大的排序规则。
那么在创建数据库时究竟如何指定 ICU 排序规则呢?
我确实在CREATE DATABASE
to use 中阅读了一个提示,template0
而不是template1
iftemplate1
可能是使用编码和整理而不是您想要的新数据库创建的。并且在使用时template0
,您需要启用数据连接以覆盖默认值。
我在 Postgres 10 doc page for Collation 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'
? 怎样才能指定ENCODING
,LC_COLLATE
以及LC_TYPE
使用新的排序规则ICU?
? 您会为面向英语的数据库建议哪些 ICU 排序规则名称?对于西欧多语言数据库?
? 可能的 ICU 归类名称是什么?
首先让我们注意,在回答这个问题时,PostgreSQL 10 仍处于测试阶段。有关 ICU 集成及其记录方式的一些问题仍在讨论中,并且在 GA 发布之前可能会有更改。
\n\n\n\n\n\xe2\x9e\xa0 如何指定 ENCODING、LC_COLLATE 和 LC_TYPE 以使用新的 ICU 排序规则?
\n
目前这是不可能的(并且可能记录得不够好,或者错误消息中不够清楚:当它说invalid locale name时,它意味着来自 提供的区域设置集libc
)。
\n开发人员邮件列表上的这个线程对此进行了讨论:\n ICU 可以用于数据库的默认排序顺序吗?
\n\n\n\xe2\x9e\xa0 对于面向英语的数据库,您建议采用什么 ICU 排序规则名称?对于西欧多语言数据库?
\n
如果您有特定的排序要求,这最重要。在邮件列表的另一个线程中:
\n用户可以在 Postgres 中使用自定义 ICU 排序规则做什么 \n10
\n给出一些具体示例,说明 ICU 排序规则的行为与 libc 的功能相比具有特殊性。
当没有特定要求时,我认为大多数应用程序不会关心它们是使用 ICU 排序规则还是 libcen_US
排序规则,除了可移植性。的一大要点ICU
是在给定区域设置的所有操作系统中获得完全相同的排序,而libc
. 我想预先创建的排序规则en-x-icu
对于一般英语来说很好,对于西欧语言,我不确定为什么任何排序规则都会比und-x-icu
.
顺便说一句,除非C
您真正关心排序规则,否则使用任何其他排序规则都不是一个好主意,因为C
作为排序规则将优于任何语言感知排序规则。并且C
可以跨操作系统移植。
\n\n\n\xe2\x9e\xa0 可能的 ICU 排序规则名称是什么?
\n
尽管initdb
填充了pg_collation
预定义排序规则列表,但完整列表可能会出现组合爆炸,\nas ICU 排序规则名称是通过组装标签形成的,如下所列:\n http://unicode.org/reports/tr35/ tr35-collation.html#Setting_Options
目前该文档没有明确提到您可以执行以下操作:
\n\nCREATE 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 值的崩溃报告
编辑:在下一个 beta 或 RC 中,由 initdb 创建的 ICU 排序规则列表将彻底改变,如本讨论中所述。该列表将通过迭代 ICU 区域设置而不是排序规则来创建,因此会出现“可能的 ICU 排序规则名称是什么?”的问题。必须根据新的价值观重新考虑。
\n 归档时间: |
|
查看次数: |
2556 次 |
最近记录: |