Postgresql 为什么文本值不等于字符值?

Postgresql 为什么文本值不等于字符值?,postgresql,text,char,string-comparison,Postgresql,Text,Char,String Comparison,我正在阅读一本关于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'::CHA

我正在阅读一本关于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正在将第二次比较的两个方面都与
文本进行比较,而
a[]
[]
表示空格)与
CHAR(2)
文本的比较并不相同

回想一下,为了在SQL数据库中进行
A=B
比较,
A
B
的类型必须相同。如果不是,即使平等比较似乎是独立进行的,在幕后最有可能发生的是一个隐含的演员阵容