postgresql的int4类型为什么长度可以达到10位

两个问题:

  1. postgresql的int4类型为什么长度可以达到10位,但是属性中设定是32位
  2. postgresql的int4类型长度默认设定32位,为什么修改不了,修改后还是32位

附截图:

这是表结构中int4 的数据属性
图片描述

这是小白我意图修改为11位的操作,最终还是32位,很无语
图片描述

这是修改为10位长度的数值,保存成功
图片描述

这是小白我意图修改为11位长度的操作,提示超出范围
图片描述

阅读 36.7k
1 个回答

用NaviCat连PG? 还有这种操作?

言归正传。看起来像是GUI工具上的一些显示内容让题主产生了误解,简单解释一下吧:

PG中int4类型对应的是SQL标准中的INTEGER类型,而且PG实现的是源生的integer类型,是定长4字节(=32位bit)。其对应的十进制取值范围是 -‭21474836478 ~ ‭2147483647‬

因此,题主截图所示的操作错误如下:

  1. 第一第二张图,题主在尝试对一个INTGEGER类型的列修改其长度:上文已述,INTEGER定长的32位二进制,因此这样的操作必然是徒劳的。

    不过GUI也有值得吐槽的地方,其“长度”概念似乎有二义性

  2. 第三第四张图,题主分别尝试向INTEGER类型的字段插入一个 INTEGER范围内的值和一个INTEGER范围外的值。因此第二次尝试是失败的(第二次的12345678901超过了INTEGER最大值2147483647‬)

    另外,从题主的描述来看,题主似乎对于二进制的位数和十进制的位数没分清。题主一直在强调要插入一个11位十进制数,可能题主看GUI里显示INTEGER类型有"32位"就误以为应该能够插入。但是实际上这里的32位是二进制的位数(这也是我上文所述的GUI的槽点: 等它显示NUMERIC类型时,长度恐怕就又要变成了十进制的长度的意思了

最后,如果题主要插入11位的十进制数,可以考虑将列的类型改为BIGINT(int8)类型或直接用NUMERIC类型

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进