最近我意识到在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,哪个是正确的答案?