根据 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 .
乍一看这很棘手。 smallint
和 bigint
下限的相同转换似乎也失败了:
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/