使用postgresql进行奇怪的排序

使用postgresql进行奇怪的排序,postgresql,sorting,collation,utf,Postgresql,Sorting,Collation,Utf,我注意到postgresql-9.5有一个奇怪的排序问题,因为它为Python脚本提供了不同的输出。据我所知,在排序时,通常从左到右一次比较一个字符: select 'ab' < 'ac'; t select 'abX' < 'ac'; t 如果我在Python中按unicode排序,我会得到类似的结果,因此我认为这不是postgresql中的错误,而是unicode排序规则规范中的错误!: >>> import locale; locale.setloca

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

select 'ab' < 'ac';
 t

select 'abX' < 'ac';
 t
如果我在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=>选择“a X”并将“C”与“a-”进行比较;
?专栏?
----------
T
(1排)
或字节比较运算符

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

test=>在windows和linux上的两个Postgresql 9.1上有效地选择“a X”:在windows上,您的上一个请求返回true,在linux上返回false,在windows上返回LC\u COLLATE='C'和在linux上返回LC\u COLLATE='tr.UTF-8'
test=> SELECT 'a X' COLLATE "C" < 'a-';
 ?column?
----------
 t
(1 row)
test=> SELECT 'a X' ~<~ 'a-';
 ?column?
----------
 t
(1 row)