PostgreSQL 是否支持 ICU 整理的选项和设置?

Eva*_*oll 3 postgresql collation postgresql-10 international-components-unicode

ICU 指定不同的LDML 整理设置。其中一些看起来很有趣,尤其是关于大小写和口音的那些,

  • “忽略重音”: strength=primary
  • “忽略重音”但要考虑大小写: strength=primary caseLevel=on
  • “忽略大小写”: strength=secondary
  • “忽略标点符号”(完全): strength=tertiary alternate=shifted
  • “忽略标点符号”但区分标点符号:strength=quaternary alternate=shifted可能是更好的做事方法

您还可以在此处查看这些文档PostgreSQL 10 ICU 整理支持是否可以使用这些 ICU 选项和设置?

CREATE COLLATION special (provider = icu, locale = 'en@strength=primary');
SELECT 'Å' LIKE 'A' COLLATE "special"; # returns false
Run Code Online (Sandbox Code Playgroud)

我也试过CLDR BCP47

从 ICU 54 开始,排序规则属性也可以通过语言环境关键字指定,使用旧的语言环境扩展语法 (" el@colCaseFirst=upper") 或语言标记语法 ("el-u-kf-upper")。关键字和值不区分大小写。请参阅LDML 归类规范、归类设置和列出有效归类关键字及其值的数据文件。(不支持已弃用的属性 kh/colHiraganaQuaternary 和 vt/variableTop。)

为此,这看起来是对的

CREATE COLLATION special (provider = icu, locale = 'en-ks-level1');
SELECT 'Å' LIKE 'A' COLLATE "special"; # returns false
Run Code Online (Sandbox Code Playgroud)

也试过en-u-ks-level1那个方法似乎是文档的目的,

CREATE COLLATION german_phonebook (provider = icu, locale = 'de-u-co-phonebk');
Run Code Online (Sandbox Code Playgroud)

Dan*_*ité 8

在 PostgreSQL 12 之前不能使用不区分大小写或不区分重音的排序规则,因为 PostgreSQL 在内部认为具有不同二进制表示的字符串是不相等的。当排序规则感知比较器表示它们相等时,它使用非排序规则感知strcmp()函数作为决胜局,以获得 Unicode 所谓的“确定性”比较而无需标准化。

从 PostgreSQL 12 开始,排序规则有一个deterministic属性,必须将其设置为false从非二进制相等字符串的相等中受益。来自CREATE COLLATION

确定性

指定排序规则是否应使用确定性比较。默认值为真。确定性比较认为不按字节相等的字符串是不相等的,即使比较认为它们在逻辑上相等。PostgreSQL 使用字节比较来打破关系。非确定性的比较会使排序规则不区分大小写或重音。为此,您需要选择适当的 LC_COLLATE 设置并将排序规则设置为不确定性。

非确定性排序规则仅受 ICU 提供程序支持。

问题中的确切查询对于非确定性排序规则是不可能的,因为它们不支持LIKE或任何形式的模式匹配(从 PostgreSQL 12 开始)。此外,语言环境应该-u-在整理子标签之前有一个,否则它们将被整理者默默地忽略。

什么按预期工作:

=# CREATE COLLATION special (
     provider = icu, locale = 'en-u-ks-level1', deterministic=false
   );

=# SELECT 'Å' = 'A' COLLATE "special";
 ?column? 
----------
 t
Run Code Online (Sandbox Code Playgroud)