PostgreSQL排序规则差异:OSX与Ubuntu

13

最近我意识到在PostgreSQL中,字符排序(collation)非常重要,并且许多评论将OSX /本地语言支持称为“损坏”,这并没有让我豁然开朗。 对于这个问题,我忽略了字符排序(collation)的表/列默认方面,并进行了显式指定。

  • 我的笔记本电脑是安装有PostgreSQL 9.2.4的OSX
  • 我的服务器是安装有PostgreSQL 9.1.9的Ubuntu

二者共同点:

  # show lc_collate ;
   en_US.UTF-8
  # show lc_ctype ;
   en_US.UTF-8

在我的笔记本电脑上:

select ',' < '-' collate "en_US.UTF-8" as result;
  true

现在,我的服务器没有 "en_US.UTF-8" 这种排序方式,但它有 "en_US.utf8"(虽然我知道这不是同一件事,但我预期它会表现相同)

select ',' < '-' collate "en_US.utf8" as result;
 false

所以,现在我有点慌了。 "C"排序规则总是会说(对于这两台机器来说)','小于'-',而我的大脑也同意这种排序。

哪个utf8实现是正确的?如果有人能向我指出定义,那会很有帮助,因为我只找到了针对OSX的“破损”指责。所以我担心自己一直以来都认为逗号在连字符之前是错误的,但在一个相当可靠的文本和Unicode仲裁者中,如Python,在Ubuntu服务器上得出:

>>> print u',' < u'-', ',' < '-'
True True

所以,我觉得在我的Ubuntu服务器上,这个排序概念比我的OSX服务器更糟糕。但是我没有“正确”的排序方法来创建我的“en_US.UTF-8”排序,如“create collation”,所以我不知道如何创建匹配,或者应该使用哪个答案(真/假)作为正确参考。(除了针对ASCII字符支持ASCII顺序的个人倾向)。

总之,对于en_US.UTF-8,哪个是正确的答案?

1个回答

6
默认Unicode排序元素表中,您可以看到以下两个条目:
002C  ; [*0220.0020.0002] # COMMA
002D  ; [*020D.0020.0002] # HYPHEN-MINUS

在这里,COMMA的主要权重大于HYPHEN-MINUS的主要权重,因此HYPHEN-MINUS排在COMMA之前。

请注意,这是根据默认权重的Unicode排序算法的预期排序顺序。如果您希望按ASCII字节值进行排序,则会获得不同的排序顺序。存在其他有效的排序顺序。但是,如果区域设置命名为"en_US.UTF-8"(或"en_US.utf8",相同的语言环境),则您可能希望使用Unicode排序。但这取决于您和操作系统供应商之间的约定。


你是在说Postgres将排序工作委托给了主机操作系统吗? - Basil Bourque
3
回答自己的问题:显然,主机操作系统(OS)在所有平台上提供了除Postgres捆绑的两种排序(C和POSIX)之外的其他排序。页面部分Managing Collations中的文档如此说明。感谢Peter的回答-我受益匪浅。 - Basil Bourque
此外,这篇文章(https://dev59.com/cnNA5IYBdhLWcg3wF5qO)回答了我关于Python排序问题的疑问。 - Woody Anderson

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