PostgreSQL负整数溢出

时间:2018-11-28 13:38:39

标签: postgresql postgresql-10 postgresql-11

当我遇到有关其范围的令人惊讶的事情时,我正在使用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。

1 个答案:

答案 0 :(得分:5)

认为这是因为强制转换运算符::的优先级高于减号。

因此-32768::smallint作为-1 * 32768::smallint执行,这实际上是无效的。

使用括号可以解决此问题:(-32768)::smallint或使用SQL标准cast()运算符:cast(-32768 as smallint)