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
相关产品推荐
相关产品推荐

