【问题标题】:PostgreSQL: wrong sorting on Ukrainian textPostgreSQL:乌克兰文本排序错误
【发布时间】:2012-01-28 07:50:00
【问题描述】:

我有三种语言的所有国家/地区的表格:英语、俄语和乌克兰语。在前两种语言上排序是可以的。但是对乌克兰国家的名字排序是不行的。

在前两个位置,它代表两个字母 'є'(ABC 中的第 8 位)和 'і'(ABC 中的第 12 位),并且所有接下来的字母都排序良好。

如何防止这种行为? DB编码为utf-8。

【问题讨论】:

    标签: postgresql sorting


    【解决方案1】:

    如果您使用的是 9.1,则可以将用于排序的排序规则添加到您的 ORDER BY 子句中:

    SELECT *
    FROM your_table
    ORDER BY your_column COLLATE "ua_UA"
    

    排序规则的名称取决于您的操作系统 - 不确定乌克兰的正确名称是什么。但我想你明白了。

    您可能还想阅读这篇博文:

    http://www.depesz.com/index.php/2011/03/04/waiting-for-9-1-per-column-collation-support/

    【讨论】:

    • 可能是升级的一个很好的理由(以及其他各种......)
    【解决方案2】:

    UTF-8 对“语言”一无所知。要使字母排序对 Postgres 有意义,您需要 set a locale。您的问题根本没有提到语言环境,所以我猜您只是使用默认语言环境(可能是英语或俄语)进行排序。

    如果您已经在使用区域设置,那么我建议提供您的客户端/服务器区域设置的详细信息,因为那里可能存在错误。

    【讨论】:

    • 我可以设置几个不同的语言环境吗?在哪里写这个 - 我的意思是在配置文件中或者我可以在 PhpPgAdmin 中完成它?它不会影响数据库性能吗?谢谢!
    • 在 initdb 运行时使用系统环境变量设置用于排序的语言环境变量 LC_COLLATE。换句话说,它是在创建数据库时设置的。以后不能更改它,因为它会破坏依赖于一致排序的索引。这意味着您需要为每种语言使用不同的数据库(至少对于 PostgreSQL 8.4 及以下版本)或您自己的排序功能。
    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多