【发布时间】:2023-03-11 16:00:02
【问题描述】:
当我尝试比较包含斜杠“/”或问号“?”的字符串时,我的 Postgres 服务器给了我非常混乱的结果。例如在我运行的 psql 中:
select ('/' < '1') as c1,
('/1' < '1') as c2,
('/////1' < '1') as c3,
('/1' < '2') as c4,
('/1' < '11') as c5;
结果是:
c1 | c2 | c3 | c4 | c5
----+----+----+----+----
t | f | f | t | t
所以'/' 小于'1',但'/1' 大于'1'。事实上'/1' 介于'1' 和'2' 之间,'/////1' 也是如此。这不符合字典顺序。
但是,'/1'(正确地)小于11,这让我更加困惑。
我想看看'/1' 是否被视为已转义。于是我跑了:
select length('/1');
我得到了2,这意味着postgres 确实将'/1' 视为两个字符串。
当我将/ 替换为$ 或? 等其他符号时,也会出现同样的问题。
如果你有 docker,这个问题很容易通过在 docker 容器中运行 postgres 来重现:
docker run postgres:11
docker exec -it `docker ps | grep postgres:11 | cut -d' ' -f 1` psql -U postgres
然后尝试上面的 SQL。我尝试了 postgres 10 图像并且行为是相同的。
当我将 VARCHAR 列与字符串文字进行比较时,真实的 SQL 也会发生同样的事情。这个问题让我发疯了,因为我需要编写正确的 SQL 来比较文件路径,其中显然包含许多“/”符号。
我搜索并没有找到任何有关此的文档,因此这看起来不像 postgres 的“官方功能”。按照字典顺序编写比较的正确方法是什么?
非常感谢。
【问题讨论】:
标签: sql postgresql collation