我正在尝试在 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/