gpt4 book ai didi

sql - Postgres 整数类型的下限超出范围?

转载 作者:行者123 更新时间:2023-12-05 04:27:11 24 4
gpt4 key购买 nike

根据 Postgres documentation ,在-2147483648+2147483647之间定义了一个integer类型。
我认为这些界限是包容性的,但如果我尝试:

select -2147483648 = -2147483648::int4

出现整数超出范围错误

上限似乎正确转换:


# select 2147483647 = 2147483647::int4;
?column?
----------
t
(1 row)

如果我将下限增加一个,它也能正常工作:

# select -2147483647 = -2147483647::int4;
?column?
----------
t
(1 row)

相同的结果应用于 smallint。是否有明显的我在这里遗漏的东西,或者是否排除了 Postgres 数字类型的下限?

最佳答案

TLDR:operator precedence .

乍一看这很棘手。 smallintbigint 下限的相同转换似乎也失败了:

SELECT -32768::int2; -- fails
SELECT -2147483648::int4; -- fails
SELECT -9223372036854775808::int8; -- fails

但外表是骗人的。这是真正发生的事情:

SELECT - (2147483648::int4);

- 被视为“一元减号” 运算符,它仅在 之后启动::(“PostgreSQL 风格的类型转换”)。由于 integer (int4) 的范围是-2147483648 到 +2147483647 正如您准确引用的那样,表达式在以下位置失败:

SELECT 2147483648::int4;

db<> fiddle here

改用其中之一:

SELECT '-2147483648'::int4;
SELECT int '-2147483648';

也稍微更高效,因为这只是一个强制转换,而不是强制转换 + 否定操作。

你甚至可以:

SELECT (-2147483648)::int4;

只是为了否决运算符的优先级。但是最后一个看起来很尴尬。而且效率略低。 :)

相关:

关于sql - Postgres 整数类型的下限超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72891258/

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