PostgreSQL排序语言特定字符(排序规则)

7
我作为一名使用非常规字符(如ÕÜÖÄ)的语言的使用者,认为如果我创建一个应用程序,允许用户将内容保存到数据库中,那么这个应用程序也应该能够根据语言设置正确地对数据进行排序。
此外,作为一种非常小的语言,如爱沙尼亚语,我必须考虑到其他人可能会使用这个应用程序,并希望以他们的语言进行排序。几种欧洲语言也有自己特殊字符的组合。
更糟糕的是,如果包括俄语等语言在内,它们具有完全不同的字符。
现在,由于我知道Django网站可以很好地显示所有这些特殊字符,我只担心排序,这是在数据库级别上进行的。那么我怎样才能确保从数据库读取对象并按正确的语言特定顺序排序呢?
例如: 如果我使用utf8编码和默认排序(英语utf8)创建数据库,那么表中包含的值就是:
alan
oskar
ölen
älan
öskar

将通过“select * from test order by nimi asc;”进行排序,结果如下:

alan
älan
ölen
oskar
öskar

这是不正确的。如果我使用POSIX排序规则创建数据库,那么相同的查询结果将为:

alan
oskar
älan
ölen
öskar

这似乎是正确的,因为如果你再加入一些名称(õlan、ålan),结果会是:

alan
oskar
älan
ålan
õlan
ölen
öskar

根据爱沙尼亚字母表,它们应该是:
alan
oskar
õlan
älan
ölen
öskar
ålan (cause å is not in estonian alphabet)

我正在使用postgresql 9.1.9,我知道自从9.1版本以来就提供了排序支持(http://www.postgresql.org/docs/9.1/interactive/collation.html)。
那么这是我应该使用的吗?
SELECT nimi COLLATE "et_EE" FROM test ORDER BY nimi ASC;

出错了,错误信息为:ERROR: collation "et_EE.utf8" for encoding "UTF8" does not exist. 为什么会出现这个错误?我需要创建这个排序规则吗?如果我想要正确排序的结果,每次查询都需要指定排序规则吗?

Alan

编辑:1 来回答问题:我的 locale -a 显示:

C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
et_EE
et_EE.iso88591
et_EE.utf8
POSIX
zh_CN.utf8
zh_SG.utf8

sudo locale-gen et_EE.UTF-8
[sudo] password for alan: 
Generating locales...
  et_EE.UTF-8... up-to-date
Generation complete.
sudo locale-gen et_EE
Generating locales...
  et_EE.ISO-8859-1... up-to-date
Generation complete.

SQL仍然失败了

编辑2:我想我弄清楚了。我还必须在postgresql中创建排序本身(http://www.postgresql.org/docs/9.1/static/sql-createcollation.html):

CREATE COLLATION "et_EE" (LOCALE = "et_EE.utf8")

所以我想我需要创建那些你告诉我的 shell 本地化文件,zero323,然后将它们创建到数据库的整理中,然后我就准备好了。

你使用什么操作系统? - zero323
顺便提一下,在葡萄牙语中,带有重音符号的字符àáãâä排在字母a之后、字母b之前,因为带有重音符号的字符与没有重音符号的相同字符是按照顺序排列的。所以对于pt-PT,我期望它按照以下顺序排序:alan、älan、oskar、ölen、öskar - ANeves
1个回答

4

您可以使用以下方法检查已安装的语言环境:

locale -a

如果 et_EE 没有列出,请运行以下命令:
sudo locale-gen et_EE
sudo locale-gen et_EE.UTF-8
sudo update-locale

请再次尝试您的查询。

谢谢。et_EE现在已列出,但是对于任何查询都没有发生任何变化。 - Odif Yltsaeb
是的。我运行了sudo /etc/init.d/postgresql restart并再次尝试了“SELECT nimi COLLATE“et_EE”FROM test ORDER BY nimi ASC;”。但它失败了。 - Odif Yltsaeb
很奇怪。我在干净的虚拟机上执行了所有步骤,一切似乎都正常工作。你的 locale -a 输出中是否有 et_EE(不带 UTF_8)?如果没有,请尝试运行 sudo locale-gen et_EE 并重复其他步骤。 - zero323
@OdifYltsaeb,你应该将那个编辑作为答案发布,而不是留在问题的末尾作为编辑。 - ANeves

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