在 PostgreSQL 中安装 utf8 排序规则

11

目前在pgAdmin4 GUI中创建新数据库时,我可以选择编码:UTF8

但是,在排序规则或字符类型方面没有选择utf8_general_ci的选项。当我执行select * from pg_collation;时,我没有看到与utf8_general_ci相关的任何排序规则。

作为一个来自MySQL背景的人,我很困惑。我是否需要在我的PostgreSQL 10或windows10中安装类似于utf8的(例如utf8_general_ciutf8_unicode_ci)排序规则?

我只想拥有相当于MySQL排序规则utf8_general_ci的PostgreSQL版本。

谢谢


1
读者注意:Postgres在10版本及以上增加了对ICU排序规则的支持。请参阅Peter Eisentraut的文章 - Basil Bourque
1个回答

12

utf8是一种编码方式(如何将Unicode字符表示为一系列字节),而不是排序规则(哪个字符排在前面)。

我认为,utf8_general_ci(或更现代的utf8_unicode_ci)在Postgres 10中对应的排序规则是und-x-icu - 这是由ICU库提供的未定义排序规则(未定义任何真实世界语言)。这个排序规则可以相当合理地排序大多数语言的字符。

ICU支持是PostgreSQL 10中添加的新功能,因此在旧版PostgreSQL版本或编译期间禁用时,此排序规则不可用。在此之前,Postgres使用操作系统提供的排序规则支持,不同操作系统之间存在差异。


2
我进行了一些测试,似乎在当前版本(10.1)中,ICU支持并不像我想象的那样完整。看起来无法创建具有und-x-icu语言环境的数据库 - 只能为某些列显式设置它。因此,在它得到改进之前,您可能需要使用create database datname template='template0' encoding='UTF8' lc_ctype='C' lc_collate='C';或其他操作系统提供的语言环境。 - Tometzky
3
你好。我在win10笔记本电脑上使用Visual C++ build 1800编译的64位PostgreSQL 10.1。我刚刚执行了CREATE DATABASE test WITH OWNER = postgres TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'und-x-icu' LC_CTYPE = 'und-x-icu' TABLESPACE = pg_default CONNECTION LIMIT = -1;,并且它成功了。我也可以在pgAdmin4 GUI中看到属性。 - slevin
此外,我要感谢你,因为我不知道ICU,你告诉了我,它看起来很棒,与C相比。它不依赖于操作系统,具有未来的可扩展性,基于Unicode标准进行排序和比较(类似于utf8_unicode_ci),实现了CLDR排序算法,这是Unicode排序算法(UCA)的扩展,也是ISO 14651的扩展。这里这里这里 - slevin
1
你好,测试在PG 11.1,Win10 x64上。CREATE DATABASE dbname WITH OWNER = postgres TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'und-x-icu' LC_CTYPE = 'und-x-icu' TABLESPACE = pg_default CONNECTION LIMIT = -1; COMMENT ON DATABASE dbname IS '...';它可以正常工作。 - XCanG
似乎只有13+支持und-x-icu。我尝试使用它,然后ILIKE查询是大小写敏感的。使用默认排序规则使ILIKE搜索不区分大小写,与预期相符。 - akostadinov
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接