我,作为一个语言的人,它有几个像ÕÜÖÄ这样的非常见字符,我认为如果我创建一个应用程序,允许用户将爱沙尼亚语的内容保存到数据库,那么这个应用程序也应该能够根据数据正确排序语言设定。
此外,作为一个非常小语言的矛,像爱沙尼亚语一样,必须考虑其他人可能使用该应用程序并希望以他们的语言进行排序。几种欧洲语言也有自己的特殊字符组合。
更糟糕的是,如果您将诸如俄语之类的语言加入其中-它们具有完全不同的字符。
现在因为我知道 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;
失败并出现错误错误:用于编码“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,然后为数据库创建排序规则,然后我就准备好了。