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/collat​​ion.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-createcollat ​​ion.html ):

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

所以我想我必须创建你告诉我的那些 shell 语言环境文件,zero323,然后为数据库创建排序规则,然后我就准备好了。

4

1 回答 1

4

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

locale -a

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

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

并再次尝试您的查询。

于 2013-09-21T14:04:27.883 回答