我正在使用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似乎没有像我预期的那样处理空间.任何人都可以解释发生了什么,并建议一种解决方法吗?
在Unix/Linux SE上,一位友好的专家解释说,你看到的是对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
现在,如果空格与字母一样重要,那么排序就无法将弗雷德和约翰的各种相同拼写分开.所以会发生的事情是它首先排序没有空格.然后在第二遍中,对没有空格的相同的字符串进行排序.(这是一种简化,真正的算法看起来相当复杂,为空格,重音和不可打印的字符分配不同级别的优先级.)
您可以通过设置来绕过Unicode排序规则:
export LC_ALL=C
或者在Postgres中通过强制转换为字节数组进行排序:
order by name::bytea
或者(从Kiln的回答)指定C
排序规则:
order by name collate "C"
或者通过更改列的默认排序规则:
alter table products alter column name type text collate "C";