You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 16使用en_US.utf8排序不符码点预期,如何解决?

解决方案:按Unicode码点排序需更换PostgreSQL排序规则

是的,你需要更换排序规则来实现按Unicode码点值排序,原因和具体操作如下:

为什么当前排序不符合预期

en_US.utf8是语言相关的排序规则,它遵循Unicode校对算法,会根据英文语言习惯调整字符的排序优先级(比如调整符号与字母的权重顺序),而非严格按照字符的Unicode码点数值比较。这就是码点更小的a(U+0061,97)被排在{a之后的原因。

实现按Unicode码点排序的方法

要严格按Unicode码点值排序,可使用**C或POSIX**排序规则——这两个规则基于字符的字节值逐字符比较,对于UTF-8编码的ASCII范围内字符,字节值与Unicode码点数值完全对应,刚好满足你的需求。

方法1:查询时临时指定排序规则

无需修改表结构,直接在ORDER BY子句中指定规则:

select * from t order by a collate "C";

方法2:创建表时设置默认排序规则

如果需要该列默认按码点排序,可在建表时配置:

create table t (a varchar(10) collate "C");

预期排序结果

执行上述查询后,结果会严格遵循Unicode码点顺序:

a
b
{a
{a{a
{aa
{a{b
{ab
{b

内容的提问来源于stack exchange,提问作者Joe DiNottra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:45:01