【问题标题】:Which PostgreSQL column type should be used to store a Java BigDecimal?应该使用哪种 PostgreSQL 列类型来存储 Java BigDecimal?
【发布时间】:2011-06-06 07:52:07
【问题描述】:

我应该使用哪种 PostgreSQL 列类型来存储 Java BigDecimal?

【问题讨论】:

    标签: java postgresql bigdecimal


    【解决方案1】:

    参见PostgreSQL datatypes - 可能是Numeric,它可以作为任意精度类型(这是一个PostgreSQL 扩展)。

    ...没有任何精度或比例创建一个列,其中可以存储任何精度和比例的数值,直到精度的实现限制。

    不过,我不完全确定“精度的实现限制”是什么。从未尝试过真正大数字。如果达到限制,则可以回退到text。但是,我怀疑在那之前还会有其他重大问题 ;-) 如果您希望存储更少,则指定精度和/或比例为 numeric

    编辑正如 sjr 指出的那样,限制是 1000 个十进制数字的精度(来自同一链接):

    类型 numeric 可以存储高达 1000 位精度的数字 [在当前的实现中] 并精确地执行计算。特别推荐用于存储货币数量和其他需要精确性的数量...

    如果需要更多精度-尽管手头有更大的问题-那么数字列将不适合(单独)。但这实际上更像是一个非常极端的“假设”,并且可能不会起到限制作用。

    【讨论】:

    • 我将您的帖子编辑为最新版本的文档。 8.2 似乎有点过时了 ;)
    • @DrColossos 非常感谢。
    【解决方案2】:

    只需将 Java 映射用于常见的 SQL 数据类型。在这种情况下,您可以使用 NUMERIC 或 DECIMAL。

    【讨论】:

    • 由于特殊支持,这在 PostgreSQL 中有效。但是,SQL 本身并没有定义任意精度的数值类型。在 SQL Server 中,最大精度为 38 位。 (但希望 BigDecimal 值保证在该范围内:-)
    • 问题是关于 PostgreSQL,而不是关于 SQL Server。 NUMERIC 和 DECIMAL 在 PostgreSQL 中没有限制:postgresql.org/docs/current/static/datatype-numeric.html
    • 根据文档,即使是 PostgreSQL,也有 1000 位精度的上限。我从来没有使用过这么大的数字,所以我不能评论。 (Java 的 BigDecimal 有 much 更大的限制。)关键是 numeric 的空间 smaller 即使我知道没有实际理由超过它,但事实是不应该被忽视。
    • @pst:NUMERIC 数据类型是 SQL 标准
    • 我很想看到一个通用的解决方案。目前我存储为字符串,但这不是很有用。
    【解决方案3】:

    我会使用 decimal 添加我自己的比例和精度:

    t.decimal "price", precision: 12, scale: 4, default: "0.0"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多