首页 文章

PostgreSQL负整数溢出

提问于
浏览
3

我在使用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 回答

  • 5

    我认为这是因为强制转换操作符 :: 的优先级高于减号 .

    所以 -32768::smallint 被执行为 -1 * 32768::smallint ,这确实是无效的 .

    使用括号修复此问题: (-32768)::smallint 或使用SQL标准 cast() 运算符: cast(-32768 as smallint)

相关问题