Postgresql order by - 扩展了丹麦语字符

标签 postgresql sql-order-by

我正在尝试在 sql 查询中使用“order by”语句。但出于某种原因,丹麦语的特殊字符被扩展而不是评估它们的值(value)。

SELECT roadname FROM mytable ORDER BY roadname

结果:

  • 能力
  • Æblerosestien
  • 阿根阿勒 1

中间的结果应该是最后一个。

区域设置为丹麦语,因此它应该知道丹麦语特殊字符的值。

最佳答案

您的数据库的排序规则是什么? (您可能还想提供您正在使用的 PostgreSQL 版本)使用 psql 中的“\l”查看。

比较和对比:

steve@steve@[local] =# select * from (values('Abildlunden'),('Æblerosestien'),('Agern Alle 1')) x(word)
order by word collate "en_GB";
     word      
---------------
 Abildlunden
 Æblerosestien
 Agern Alle 1
(3 rows)

steve@steve@[local] =# select * from (values('Abildlunden'),('Æblerosestien'),('Agern Alle 1')) x(word)
order by word collate "da_DK";
     word      
---------------
 Abildlunden
 Agern Alle 1
 Æblerosestien
(3 rows)

数据库排序规则是在您创建数据库集群时根据您当时设置的语言环境设置的。如果您通过包管理器(例如 apt-get)安装了 PostgreSQL,那么它很可能是从系统默认语言环境中获取的。

您可以覆盖特定列中使用的排序规则,甚至可以覆盖特定表达式中使用的排序规则(如上例所示)。然而,如果你没有指定任何东西(可能),那么将使用数据库默认值(它本身是在创建数据库时从模板数据库继承的,并且在创建集群时固定模板数据库排序规则)

如果您想始终使用 da_DK 作为您的默认排序规则,并且它当前不是您的数据库默认值,您最简单的选择可能是转储数据库,然后删除并重新创建集群,指定initdb 的排序规则(或 pg_createcluster 或您用来创建服务器的任何工具)

顺便说一句,这个问题措辞不当。 PostgreSQL 并没有忽略“特殊”字符,它正确地将“Æ”扩展为“AE”——这是英语的正确规则。最后整理“Æ”实际上更像是未本地化的行为。

整理文档:http://www.postgresql.org/docs/current/static/collation.html

关于Postgresql order by - 扩展了丹麦语字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13910949/

相关文章:

postgresql - 如何将环境变量传递到 .sql 文件中?

ruby-on-rails - 基于小时的 ActiveRecord 范围

MySQL:ORDER BY 显着减慢了查询速度

当列值更改并匹配搜索参数时MySQL查询返回行

mysql order by asc问题

postgresql - Now() 没有时区

sql - Postgres : is NOW() used in more places of the query guaranteed to be always the same?

sql - 使用 Postgres JSON 函数从具有与其他表关系的表生成完整的 JSON 对象

sql - 按联接表中的列排序的慢查询

SQL Case Order 按特定顺序