【问题标题】:Can the Postgres data type NUMERIC store signed values?Postgres 数据类型 NUMERIC 可以存储带符号的值吗?
【发布时间】:2015-06-05 13:54:35
【问题描述】:

在 PostgreSQL 中,我想存储签名值 -999.9 - 9999.9。 我可以为此使用numeric(5.1) 吗?

或者我应该使用什么类型?

【问题讨论】:

  • postgresql 数字的精度是有效位数的总数,小数位数是所需的小数位数。 9999.9 有 5 位数字和 1 位小数,所以是的,numeric(5.1) 可以。详情请见the documentation
  • 是数字(5.1) 是否适合 -999.9?
  • 你为什么不尝试插入一个负值,看看会发生什么?无论如何,numeric 是 sql 标准的一部分,是的,它已签名。

标签: postgresql types postgresql-9.1 signed


【解决方案1】:

您当然可以使用arbitrary precision type numeric,精度为5,比例为1,just like @Simon commented,但不会出现语法错误。在类型修饰符中使用逗号(,)而不是点(.):

SELECT numeric(5,1) '-999.9' AS nr_lower
     , numeric(5,1) '9999.9' AS nr_upper;

 nr_lower | nr_upper
----------+----------
   -999.9 |   9999.9

字符串文字中的减号和点不计入有效数字的允许最大值 (precision)。
如果不需要限制长度,使用numeric即可。
如果您需要强制执行最小值和最大值,请添加check constraint

CHECK (nr_column BETWEEN -999.9 AND 9999.9)

numeric准确地存储您的号码。如果您不需要绝对精度并且微小的舍入误差没问题,您还可以使用浮点类型double precision (float8) 或real (float4) 之一。

或者,由于您只允许一个小数位,您可以乘以 10 并使用 integer,这将是最有效的存储:4 个字节,没有舍入错误和最快的处理。只需正确使用并记录该号码。

Details for numeric types in the manual.

【讨论】:

  • 谢谢@Erwin,很好的回答!
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2020-04-26
相关资源
最近更新 更多