PostgreSQL执行ORDER BY DESC排序结果异常,是否为软件本身Bug?
问题结论
这不是PostgreSQL的Bug,该现象是由数据库默认使用的本地化排序规则(collation)导致的,属于预期内的行为。
原因说明
Ubuntu 20.04默认的UTF-8区域排序规则(如en_US.UTF-8、zh_CN.UTF-8)对字符串排序时遵循以下逻辑,和你预期的排序规则不一致:
- 数字按单个字符逐个比对,而非按整体数值大小比对:比如
testing app 7里的7和testing app 22里的2做比对,字符7的编码值大于2,降序排序时自然会排在更前面 - 大小写排序优先级符合本地化规则:小写字母
t的排序优先级高于大写字母T,所以所有小写开头的testing相关结果都会排在大写开头的Test、Testing结果前面
解决方法
你可以根据需求选择以下任意一种方案修正排序逻辑:
- 如果需要严格按UTF-8字节编码排序,修改查询语句为:
select name from leads_lead as ll where ll.branch_id = 14 order by convert_to(ll.name, 'UTF8') desc;
- 如果需要实现数字按数值大小排序的效果(PostgreSQL 10+支持ICU排序规则),可指定带数字感知的排序规则:
select name from leads_lead as ll where ll.branch_id = 14 order by ll.name collate "en-US-u-kn-true" desc;
- 如果需要全局生效,可在建库时指定符合你排序预期的collation,无需每次查询额外声明。
内容的提问来源于stack exchange,提问作者uddum
相关产品推荐
相关产品推荐

