postgresql - 为什么 text 值不等于 char 值?
问题描述
我正在浏览一本关于 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[ ]
([ ]
表示一个空格) 不是来自 aCHAR(2)
和 from的同一件事text
。
回想一下,为了A = B
在 SQL 数据库中进行比较,两者的类型A
和B
必须相同。如果不是,即使看起来相等比较本身正在工作,在幕后很可能会发生隐式转换。
推荐阅读
- javascript - electron.remote 在渲染过程中未定义
- java - Kotlin 中 dl4j 的通用函数
- spring - 为构建管道配置fladdoodles嵌入式mongodb
- swift - 如何将对本地图像的引用插入到 html 并在标签中快速显示?
- upgrade - 将 Artifactory 从 6.10.9 升级到 7.7.3 时出现数据库迁移问题
- sql-server - MSSQL 关键字“SELECT”附近的语法不正确
- javascript - 如果在 nodejs 中的 res 之前没有返回,是否可以让规则制定 eslint 显示警告/错误?
- sql - Access DB:在组内添加新的行号列
- python - 使用 pandas 或 csv 从 csv 文件中删除某些分隔符
- javascript - 如何在 Redux 中测试递归调度