gpt4 book ai didi

postgresql - 什么决定了 PostgreSQL 过滤的数据类型?

转载 作者:行者123 更新时间:2023-11-29 11:49:31 24 4
gpt4 key购买 nike

我非常熟悉 IEEE 754 单精度和 double 据类型的超值。我已经阅读了关于每个计算机科学家应该知道的关于浮点运算的文章,但我对 Postgresql 做出的选择感到困惑。

我创建一个表

create table ttt(f4 float4, f8 float8, fn numeric);

我添加一些值:

insert into ttt (f4,f8,fn) values(12.206,12.206,12.206);

我做一个查询:

select count(*) from ttt where f4=12.206;
count
-------
0
(1 row)

我求一个解释:

gsh=# explain select count(*) from ttt where f4=12.206;
QUERY PLAN
----------------------------------------------------------
Aggregate (cost=23.77..23.78 rows=1 width=0)
-> Seq Scan on ttt (cost=0.00..23.75 rows=6 width=0)
Filter: (f4 = 12.206::double precision)
(3 rows)

所以查询试图匹配 double 版本12.206 到存储为单精度的值,它们不是匹配,这不足为奇。

令我惊讶的是,因为默认情况下 postgresql似乎将数字视为数字:

gsh=# select 12.206;
?column?
----------
12.206
(1 row)

gsh=# select pg_typeof(12.206);
pg_typeof
-----------
numeric
(1 row)

如果数字在默认情况下被视为数字,为什么过滤器不比较反对 12.206 作为数字而不是 double ?我发现这违反了最不令人惊讶的规定。

有什么想法吗?

最佳答案

这可以用 type resolution rules for operators 来解释.

正如您正确观察到的那样,表达式中 = 运算符左侧的类型是 real,右侧的类型是 numeric

存在从numericdouble precisionreal以及从realdouble的隐式转换精度(用psql中的“\dCS”检查)。如果您检查可用的 = 运算符(检查 psql 中的“\doS =”),您会发现在步骤 3.a 之后。保留以下运算符:

real             = double precision
double precision = double precision

在步骤 3.c. 中,选择第一个运算符,因为它与左侧输入类型完全匹配。

您可以通过使用 real 常量来强制使用 real = real 运算符,例如

... WHERE f4 = 12.206::real

... WHERE f4 = REAL '12.206'

关于postgresql - 什么决定了 PostgreSQL 过滤的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43398625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com