PostgreSQL 负整数溢出
PostgreSQL Negative Integer Overflow
我正在使用 tinyint 扩展对 Postgres 进行一些测试,这时我发现了关于它的范围的一些令人惊讶的事情。在键入 select -128::tinyint
时,它给了我一条 ERROR: tinyint out of range
消息,这完全不是我所期望的。
假设负数应该比最大正数(单字节整数为 127)大 1(或小于)我认为这是扩展的错误,但是在尝试使用非扩展数字时我发现完全一样的事情正在发生。
select -32768::smallint
-> 超出范围
select -2147483648::integer
-> 超出范围
select -9223372036854775808::bigint
-> 超出范围
参考数字数据类型文档(https://www.postgresql.org/docs/current/datatype-numeric.html)
这些数字应该都是可能的——所有负数减一 -32767
、-2147483647
、-9223372036854775807
都可以正常工作,所以我很好奇为什么会发生这种情况,或者这甚至会发生在其他人身上副本。
我尝试在 ubuntu 16.x 桌面上同时使用 postgresql 10 和 postgresql 11。
我 认为 这是因为转换运算符 ::
比减号具有更高的优先级。
所以-32768::smallint
被执行为-1 * 32768::smallint
这确实是无效的。
使用括号解决这个问题:(-32768)::smallint
或使用 SQL 标准 cast()
运算符:cast(-32768 as smallint)
我正在使用 tinyint 扩展对 Postgres 进行一些测试,这时我发现了关于它的范围的一些令人惊讶的事情。在键入 select -128::tinyint
时,它给了我一条 ERROR: tinyint out of range
消息,这完全不是我所期望的。
假设负数应该比最大正数(单字节整数为 127)大 1(或小于)我认为这是扩展的错误,但是在尝试使用非扩展数字时我发现完全一样的事情正在发生。
select -32768::smallint
-> 超出范围
select -2147483648::integer
-> 超出范围
select -9223372036854775808::bigint
-> 超出范围
参考数字数据类型文档(https://www.postgresql.org/docs/current/datatype-numeric.html)
这些数字应该都是可能的——所有负数减一 -32767
、-2147483647
、-9223372036854775807
都可以正常工作,所以我很好奇为什么会发生这种情况,或者这甚至会发生在其他人身上副本。
我尝试在 ubuntu 16.x 桌面上同时使用 postgresql 10 和 postgresql 11。
我 认为 这是因为转换运算符 ::
比减号具有更高的优先级。
所以-32768::smallint
被执行为-1 * 32768::smallint
这确实是无效的。
使用括号解决这个问题:(-32768)::smallint
或使用 SQL 标准 cast()
运算符:cast(-32768 as smallint)