我正在浏览有关PostgreSQL的书,并找到以下示例:
SELECT
'a '::VARCHAR(2) = 'a '::TEXT AS "Text and varchar",
'a '::CHAR(2) = 'a '::TEXT AS "Char and text",
'a '::CHAR(2) = 'a '::VARCHAR(2) AS "Char and varchar";
产生:
这很奇怪,在书中说:
前面的示例显示'a':: CHAR(2)等于'a':: VARCHAR(2),但是两者都有不同的长度,这是不合逻辑的。同样,它表明'a':: CHAR(2)不等于'a':: text。最后,'a':: VARCHAR(2)等于'a':: text。前面的例子导致混淆是因为如果变量a等于b,并且b等于c,根据数学,a应等于c。
但是没有解释为什么?是否有关于数据存储方式的信息,或者这可能是CHAR
类型的遗留行为?
您看到的行为似乎是由于Postgres在幕后进行了一些转换而解释的。考虑以下稍微修改的查询版本:
SELECT
'a '::VARCHAR(2) = 'a '::TEXT AS "Text and varchar",
'a '::CHAR(2) = CAST('a '::TEXT AS CHAR(2)) AS "Char and text",
'a '::CHAR(2) = 'a '::VARCHAR(2) AS "Char and varchar";
这将为所有三个比较返回True
。显然,Postgres正在将第二个比较的两边都强制转换为text
,并且a[ ]
([ ]
表示空格)不是来自CHAR(2)
和text
的东西。
回想一下,为了在SQL数据库中进行A = B
比较,A
和B
的两种类型必须相同。如果不是这样,即使平等比较似乎是自己进行的,在幕后最有可能发生隐式转换。