gpt4 book ai didi

PostgreSQL 在排序时忽略破折号

转载 作者:行者123 更新时间:2023-11-29 11:33:05 24 4
gpt4 key购买 nike

我有一个使用 da_DK.utf8 语言环境创建的 PostgreSQL 8.4 数据库。

dbname=> show lc_collate;
lc_collate
------------
da_DK.utf8
(1 row)

当我从我在字符变化列上订购的表格中选择某些内容时,我得到了一个奇怪的行为 IMO。在对结果进行排序时,PostgreSQL 会忽略作为值前缀的破折号,例如:

 select name from mytable order by name asc;

可能会返回类似的东西

 name
----------------
Ad...
Ae...
Ag...
- Ak....
At....

破折号前缀似乎被忽略了。

我可以通过在订购时将列转换为 latin1 来解决此问题:

 select name from mytable order by convert_to(name, 'latin1') asc;

我得到的预期结果是:

 name
----------------
- Ak....
Ad...
Ae...
Ag...
At....

为什么默认情况下会忽略破折号前缀?这种行为可以改变吗?

最佳答案

这是因为 da_DK.utf8 语言环境是这样定义的。 Linux 区域设置感知实用程序,例如 sort 也将像这样工作。

如果您的 convert_to(name, 'latin1') 发现一个不在 Latin 1 字符集中的字符,例如 ,它就会中断,所以它不是这不是一个好的解决方法。

您可以使用 order by convert_to(name, 'SQL_ASCII'),这将忽略语言环境定义的排序并仅使用字节值。


丑陋的黑客编辑:

order by
(
ascii(name) between ascii('a') and ascii('z')
or ascii(name) between ascii('A') and ascii('Z')
or ascii(name)>127
),
name;

这将首先对以 ASCII 非字母开头的任何内容进行排序。这非常难看,因为在字符串中进一步排序会表现得很奇怪,但它对您来说已经足够好了。

关于PostgreSQL 在排序时忽略破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955386/

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