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";
我正在使用 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
中执行以下 SQLSELECT 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";