Postgresql 9.4 中的空格 sort/collation/order 不正确

Incorrect sort/collation/order with spaces in 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 table 的 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 似乎没有按照我预期的方式处理空格。任何人都可以解释发生了什么并提出解决此问题的方法吗?

Unix/Linux SE, a friendly expert explained that what you see is the proper way to sort Unicode. Basically, the standard 上正在尝试排序:

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

现在,如果空格与字母一样重要,则排序无法区分 Fred 和 John 的各种相同拼写。所以发生的是它首先排序没有空格。然后在第二遍中,对没有空格的相同字符串进行排序。 (这是一种简化,真正的算法看起来相当复杂,为空格、重音符号和 non-printable 字符分配不同的优先级。)

您可以通过设置绕过 Unicode 排序规则:

export LC_ALL=C

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

order by name::bytea

或(来自 )通过指定 C 归类:

order by name collate "C"

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

alter table products alter column name type text collate "C";