Похоже, что поведение, которое вы видите, объясняется тем, что 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
.
Напомним, что для сравнения A = B
в базе данных SQL оба типа A
и B
должны быть одинаковыми. Если нет, даже если кажется, что сравнение на равенство работает само по себе, под капотом, скорее всего, происходит неявное приведение.