Postgresql 9.4中的空格排序/排序/排序错误

时间:2015-12-30 22:07:31

标签: postgresql postgresql-9.4

我正在使用Postgresql 9.4.5。当我转到psql并运行\l时,我得到了

Encoding is UTF8
Collate is en_US.UTF-8 
cCtype is en_US.UTF-8

我的products表格带有name列,其中包含以下名称:

T-700A Grouped
T-700 AGrouped
T-700A Halved
T-700 Whole

当我在pql中执行以下SQL时

SELECT name FROM products WHERE name LIKE '%T-700%' ORDER By name ASC;

我得到以下输出

T-700A Grouped
T-700 AGrouped
T-700A Halved
T-700 Whole

排序看起来并不自然。我希望得到

T-700 AGrouped
T-700 Whole
T-700A Grouped
T-700A Halved

看起来Postgres似乎没有按照我的预期处理空间。任何人都可以解释发生了什么,并建议一种方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:11)

Unix/Linux SE, a friendly expert explained上,您看到的是对Unicode进行排序的正确方法。基本上,standard正试图排序:

return

现在,如果空格与字母一样重要,那么排序就无法将弗雷德和约翰的各种相同拼写分开。所以会发生的事情是它首先排序没有空格。然后在第二遍中,对没有空格的相同的字符串进行排序。 (这是一种简化,真正的算法看起来相当复杂,为空格,重音和不可打印的字符分配不同级别的优先级。)

您可以通过设置:

来绕过Unicode排序规则
di Silva Fred                  di Silva Fred
di Silva John                  diSilva Fred
diSilva Fred                   disílva Fred
diSilva John         ->        di Silva John
disílva Fred                   diSilva John
disílva John                   disílva John

或者在Postgres中通过转换为字节数组进行排序:

export LC_ALL=C

或(来自Kiln's answer)指定order by name::bytea 归类:

C

或者通过更改列的默认排序规则:

order by name collate "C"