gpt4 book ai didi

PostgreSQL 将尾随零添加到数字

转载 作者:行者123 更新时间:2023-11-29 11:20:39 26 4
gpt4 key购买 nike

最近我将一个数据库迁移到 PostgreSQL,其中一些列定义为 numeric(9,3)numeric(9,4)。在测试该应用程序时,我发现当数据保存到这些列时,插入的值中会添加尾随零。我正在使用 Hibernate,并且我的日志显示了为准备好的语句构建的正确值。

我插入的数据示例是numeric(9,3) 列中的0.75,存储的值是0.750numeric(9,4) 列的另一个示例:我插入值 12 并且数据库持有 12.0000

我发现了这个相关问题:postgresql numeric type without trailing zeros .但除了引用 9.x 文档中说不添加尾随零之外,它没有提供其他解决方案。从那个问题,答案引用了文档(我也读过)说:

Numeric values are physically stored without any extra leading or trailing zeroes. Thus, the declared precision and scale of a column are maximums, not fixed allocations.

但是,就像那个问题海报一样,我看到添加了尾随零。 Hibernate 在日志中生成的原始插入没有显示这个额外的包袱。所以我假设这是我没有正确设置的 PostgreSQL 东西,我只是找不到我是怎么弄错的。

最佳答案

如果我在这种情况下正确理解“强制”,我认为就是这样。这是来自 PostgreSQL 文档:

Both the maximum precision and the maximum scale of a numeric column can be configured. To declare a column of type numeric use the syntax:

NUMERIC(precision, scale)

The precision must be positive, the scale zero or positive. Alternatively:

NUMERIC(precision)

selects a scale of 0. Specifying:

NUMERIC

without any precision or scale creates a column in which numeric values of any precision and scale can be stored, up to the implementation limit on precision. A column of this kind will not coerce input values to any particular scale, whereas numeric columns with a declared scale will coerce input values to that scale.

大胆强调我的。

因此在同一部分的后面部分误导:

Numeric values are physically stored without any extra leading or trailing zeroes. Thus, the declared precision and scale of a column are maximums, not fixed allocations.

我再次大胆强调。

这对于精度部分可能是正确的,但由于比例在定义时被强制转换,因此将尾随零添加到输入值以满足比例定义(如果太大,我会假设被截断)。

我正在使用 precision,scale 定义来强制执行约束。正是在 DB 插入期间,尾随零被添加到数字标度中,这似乎支持强制转换并与不添加尾随零的声明相冲突。

正确与否,我必须在选择完成后在代码中处理问题。对我来说幸运的是,受影响的属性是 BigDecimal,因此去除尾随零很容易(尽管不优雅)。如果有人对不让 PostgreSQL 在插入时将尾随零添加到数字比例有更好的建议,我对他们持开放态度。

关于PostgreSQL 将尾随零添加到数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26920157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com