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)