gpt4 book ai didi

postgresql - Postgresql 9.4 中带有空格的错误排序/整理/顺序

转载 作者:行者123 更新时间:2023-11-29 11:38:07 25 4
gpt4 key购买 nike

我正在使用 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, a friendly expert explained您所看到的是对 Unicode 进行排序的正确方法。基本上,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 的各种相同拼写。所以发生的是它首先排序没有空格。然后在第二遍中,对没有空格的相同字符串进行排序。 (这是一个简化,真正的算法看起来相当复杂,为空格、重音符号和不可打印的字符分配不同级别的优先级。)

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

export LC_ALL=C

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

order by name::bytea

或者(来自 Kiln's answer )通过指定 C 排序规则:

order by name collate "C"

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

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

关于postgresql - Postgresql 9.4 中带有空格的错误排序/整理/顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34537982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com