gpt4 book ai didi

postgresql - 与 postgresql 的奇怪排序

转载 作者:行者123 更新时间:2023-11-29 12:10:37 24 4
gpt4 key购买 nike

我注意到 postgresql-9.5 有一个奇怪的排序规则问题,因为它向 Python 脚本提供了不同的输出。据我了解,通常在排序时从左到右一次比较一个字符:

select 'ab' < 'ac';
t

select 'abX' < 'ac';
t

因此,如果您将“X”添加到上面的左侧字符串,则无关紧要。

所以当这不适用于空格和破折号之间的比较时,我感到很惊讶:

select 'a ' < 'a-';
t

select 'a X' < 'a-';
f

这是一个错误还是有什么办法解决这个问题;我希望上面的最后一条语句也返回 true。


[接受@laurenz-albe 的回答后进行编辑]

show lc_collate;
en_US.UTF-8

如果我在 Python 中按 unicode 进行排序,我会得到类似的结果,所以这不是 postgresql 中的错误,而是我认为 unicode 归类规范中的错误!:

>>> import locale; locale.setlocale(locale.LC_ALL, "")
'en_US.UTF-8'
>>> l = ['ac', 'ab']; sorted(l) == sorted(l, cmp=locale.strcoll)
True
>>> l = ['ac', 'abX']; sorted(l) == sorted(l, cmp=locale.strcoll)
True
>>> l = ['ac', 'abX']; sorted(l) == sorted(l, cmp=locale.strcoll)
True
>>> l = ['a-', 'a X']; sorted(l) == sorted(l, cmp=locale.strcoll)
False
>>> sorted(l), sorted(l, cmp=locale.strcoll)
(['a X', 'a-'], ['a-', 'a X'])

最佳答案

使用排序规则比较字符。可以使用 SQL 命令

SHOW lc_collate;

查看您的默认排序规则是什么。

PostgreSQL 使用操作系统的排序规则,因此比较的结果通常取决于操作系统。

要强制按字节进行 ASCII 比较,请使用 C 排序规则

test=> SELECT 'a X' COLLATE "C" < 'a-';
?column?
----------
t
(1 row)

或字节比较运算符

test=> SELECT 'a X' ~<~ 'a-';
?column?
----------
t
(1 row)

关于postgresql - 与 postgresql 的奇怪排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37836582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com