当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《Postgresql9.4中的空格排序/排序/排序错误》经验,为你挑选了1个好方法。

我正在使用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> Andomar..:

在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";

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有