我作为一名使用非常规字符(如ÕÜÖÄ)的语言的使用者,认为如果我创建一个应用程序,允许用户将内容保存到数据库中,那么这个应用程序也应该能够根据语言设置正确地对数据进行排序。
此外,作为一种非常小的语言,如爱沙尼亚语,我必须考虑到其他人可能会使用这个应用程序,并希望以他们的语言进行排序。几种欧洲语言也有自己特殊字符的组合。
更糟糕的是,如果包括俄语等语言在内,它们具有完全不同的字符。
现在,由于我知道Django网站可以很好地显示所有这些特殊字符,我只担心排序,这是在数据库级别上进行的。那么我怎样才能确保从数据库读取对象并按正确的语言特定顺序排序呢?
例如: 如果我使用utf8编码和默认排序(英语utf8)创建数据库,那么表中包含的值就是:
根据爱沙尼亚字母表,它们应该是:
我正在使用postgresql 9.1.9,我知道自从9.1版本以来就提供了排序支持(http://www.postgresql.org/docs/9.1/interactive/collation.html)。
那么这是我应该使用的吗?
所以我想我需要创建那些你告诉我的 shell 本地化文件,zero323,然后将它们创建到数据库的整理中,然后我就准备好了。
此外,作为一种非常小的语言,如爱沙尼亚语,我必须考虑到其他人可能会使用这个应用程序,并希望以他们的语言进行排序。几种欧洲语言也有自己特殊字符的组合。
更糟糕的是,如果包括俄语等语言在内,它们具有完全不同的字符。
现在,由于我知道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,然后将它们创建到数据库的整理中,然后我就准备好了。
àáãâä
排在字母a
之后、字母b
之前,因为带有重音符号的字符与没有重音符号的相同字符是按照顺序排列的。所以对于pt-PT
,我期望它按照以下顺序排序:alan、älan、oskar、ölen、öskar
。 - ANeves