为什么文本值不等于char值?

问题描述 投票:1回答:1

我正在浏览有关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";

产生:

enter image description here

这很奇怪,在书中说:

前面的示例显示'a':: CHAR(2)等于'a':: VARCHAR(2),但是两者都有不同的长度,这是不合逻辑的。同样,它表明'a':: CHAR(2)不等于'a':: text。最后,'a':: VARCHAR(2)等于'a':: text。前面的例子导致混淆是因为如果变量a等于b,并且b等于c,根据数学,a应等于c。

但是没有解释为什么?是否有关于数据存储方式的信息,或者这可能是CHAR类型的遗留行为?

postgresql text char string-comparison
1个回答
0
投票

您看到的行为似乎是由于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比较,AB的两种类型必须相同。如果不是这样,即使平等比较似乎是自己进行的,在幕后最有可能发生隐式转换。

© www.soinside.com 2019 - 2024. All rights reserved.