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。

4

1 回答 1

5

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

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

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

于 2018-11-28T13:42:34.367 回答