当我尝试比较包含斜杠“/”或问号“?”的字符串时,我的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的“官方特性”。什么是编写遵循词典顺序比较的正确方法?非常感谢。