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

Posted

技术标签:

【中文标题】Postgresql 排序语言特定字符(排序规则)【英文标题】:Postgresql sorting language specific characters (collation) 【发布时间】:2013-09-26 19:05:10 【问题描述】:

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

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

更糟糕的是,如果您将俄语等语言加入其中 - 它们具有完全不同的字符。

现在因为我知道 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-createcollation.html):

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

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

【问题讨论】:

你使用什么操作系统? 顺便说一下,在葡萄牙语中,àáãâä 位于a 之后和b 之前,因为带重音的字符排在相同的不带重音的字符旁边。所以对于pt-PT,我希望它订购alan älan oskar ölen öskar 【参考方案1】:

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

locale -a

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

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

然后再次尝试查询。

【讨论】:

谢谢。现在列出了 et_EE,但任何查询都没有改变 是的。我运行 sudo /etc/init.d/postgresql restart 并尝试“SELECT nimi COLLATE “et_EE” FROM test ORDER BY nimi ASC;”再次。它失败了 这很奇怪。我在干净的虚拟机上执行了所有步骤,一切似乎都正常。您是否在locale -a 输出中使用et_EE(没有UTF_8)?如果没有尝试sudo locale-gen et_EE 并重复其他步骤。 @OdifYltsaeb 您应该将该编辑作为答案发布,而不是在问题结束时将其作为编辑。

以上是关于Postgresql 排序语言特定字符(排序规则)的主要内容,如果未能解决你的问题,请参考以下文章

向 PostgreSQL 添加不区分大小写的排序规则

SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

PostgreSQL UTF-8 二进制排序规则

在 PostgreSQL 中安装 utf8 排序规则

Ruby操作MongoDB(进阶七)-排序规则Collations

我在哪里可以找到一组特定的排序规则来比较字符串的相等性?