Postgresql排序语言特定字符(整理)

时间:2013-09-21 13:01:44

标签: sql postgresql sorting collation

我作为语言的发言者,有几个非常见的字符,如ÕÜÖÄ,认为如果我创建一个允许用户将爱沙尼亚语内容保存到数据库的应用程序,那么这个应用程序也应该能够对数据进行排序根据语言设置正确。

此外,作为一种非常小的语言,像爱沙尼亚语一样,必须考虑,其他人可能会使用该应用程序,并希望用他们的语言进行排序。几种欧洲语言也有自己的特殊字符组合。

更糟糕的是,如果你把俄语这样的语言包括在内 - 它们的角色完全不同。

现在我知道django网站可以很好地显示所有这些特殊字符,我只担心排序,这是在数据库级别。那么我怎样才能确保从数据库中读取对象并将其分类为正确的,特定于语言的顺序。

示例案例: 如果我用utf8编码创建数据库并使用默认排序规则(英语utf8),那么表包含值

alan
oskar
ölen
älan
öskar

将被排序(通过“从测试顺序中选择*由nimi asc;”)到:

alan
älan
ölen
oskar
öskar

哪个不对。如果我使用POSIX排序规则创建数据库,则相同的查询结果为:

alan
oskar
älan
ölen
öskar

这个SEEMS是正确的,因为如果你把更多的名字(õ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;

失败并出现错误错误:用于编码“UTF8”的排序规则“et_EE.utf8”不存在。这是为什么? 我是否必须创建此排序规则或其他内容? 这是可行的方法 - 如果我希望结果的顺序正确,可以为每个查询指定排序规则吗?

艾伦

编辑:1回答问题: 我的语言环境-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仍然失败

Edit2:我想我想通了。我不得不在postgresql中创建排序规则(http://www.postgresql.org/docs/9.1/static/sql-createcollation.html):

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

所以我想我必须创建那些你告诉我的shell语言环境文件,零323,然后创建归类到数据库,然后我就完全了。

1 个答案:

答案 0 :(得分:3)

您可以使用以下方式检查已安装的区域设置:

locale -a

如果未列出et_EE,请运行以下命令:

sudo locale-gen et_EE
sudo locale-gen et_EE.UTF-8
sudo update-locale

再次尝试查询。