2

我不熟悉 Postgresql。尝试学习它,因为我正在将我的 Rails 应用程序移动到 Heroku。

这是一个关于排序问题的例子。

# select name_kr from users order by name_kr;

 name_kr 
---------
 곽철
 김영
 박영
 안준
 양민
 이남
 임유
 정신
 차욱
 강동수
 강상구
 강신용
 강용석
 강지영
 강지원
 강호석

你可能听不懂韩语。但一个奇怪的事情是它首先显示 2 个音节单词和 3 个音节 - 每个都在其组中正确排序。

以下是相关信息:

kwanak_development=# show lc_collate;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

kwanak_development=# show lc_ctype;
  lc_ctype   
-------------
 en_US.UTF-8
(1 row)

我做错了什么?

谢谢。

山姆

附加信息:

我尝试排序排序,得到了一个有趣的结果。

select name_kr from users order by name_kr collate "ko_KR"; => Same as above
select name_kr from users order by name_kr collate "C"; => Correct Result
4

2 回答 2

2

sortPostgreSQL 排序规则主要由 PostgreSQL 处理,并且应该遵循与 UNIX命令相同的规则。要做的第一件事是尝试使用该sort命令来确定这是否确实是问题所在,或者它是否仅仅是堆栈中更深层次的问题的症状。

如果sort在相同的语言环境设置下没有显示这个问题,那么请向 PostgreSQL 团队提交一个错误(这让我觉得不太可能,但这是可能的)。如果它确实显示了问题,那么您将需要与您正在使用的标准 C 库的制造商联系。

作为对我们这些不熟悉韩语排序的人的最后说明,您可能想尝试描述所需的排序,而不仅仅是问题排序。

于 2013-04-20T07:34:40.400 回答
1

在 OS X 上使用 GNU sort5.93,我在默认语言环境中得到相同的顺序(这可能是 en_GB.utf8 或 en_US.utf8 之一 - 无论如何都不懂韩语)。但是,如果我设置LC_ALL为 ko_KR.utf8,我会首先对三个字符串进行排序。两个和三个字符串的集合在它们之间保持相同的顺序。

请注意,所有三个字符的名称都以“강”开头。这看起来是'강'在一个幼稚的语言环境中排序在所有其他初始字符之后,但在韩语中排序在它之前。如果我插入一个由三个字符串之一组成的无意义字符串,其中初始字符替换为两个字符串之一的初始字符(即“양호석”),那么它与两个字符排序字符串。这说明排序顺序与字符串的长度无关,只与'강'的排序有关。

我完全不知道为什么“강”会排在我所在地区的其他字符之后。'강' 位于代码点 U+AC15。'곽' 位于代码点 U+ACFD。'차' 位于代码点 U+CC28。如果排序是在原始代码点上,“강”将排在其他字符之前,就像韩语排序一样。

如果我用 Java 对这些字符串进行排序,它们首先会出现 '강' 字符串,就像韩语排序一样。Java 对 unicode 问题非常小心。它和韩国人一致的事实让我认为这是正确的顺序。

如果您以 UTF-8 对字符进行编码,那么它的第一个字节是 0xea,它将再次排在其他字符之前,这些字符编码为从 0xea 到 0xec 的值开始的字节。这大概就是为什么collate "C"会给你正确的结果 - 该设置导致字符串被排序为不透明字节的字符串,而不是编码字符。

我对为什么collate "ko_KR"给出错误的结果感到完全困惑。

于 2013-06-09T20:55:10.510 回答