我正在尝试在 sql 查询中使用“order by”语句。但是由于某种原因,丹麦特殊字符被扩展而不是评估它们的值。
SELECT roadname FROM mytable ORDER BY roadname
结果:
- 阿比伦登
- Æblerosestien
- 艾格恩阿勒 1
中间的结果应该是最后一个。
语言环境设置为丹麦语,因此它应该知道丹麦语特殊字符的值。
我正在尝试在 sql 查询中使用“order by”语句。但是由于某种原因,丹麦特殊字符被扩展而不是评估它们的值。
SELECT roadname FROM mytable ORDER BY roadname
结果:
中间的结果应该是最后一个。
语言环境设置为丹麦语,因此它应该知道丹麦语特殊字符的值。
你的数据库的排序规则是什么?(您可能还想提供您正在使用的 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