最近我将一个数据库迁移到 PostgreSQL,其中一些列定义为numeric(9,3)
and numeric(9,4)
。在测试应用程序时,我发现当数据保存到这些列时,插入的值中会添加尾随零。我正在使用 Hibernate,我的日志显示为准备好的语句构建的正确值。
我插入的数据的一个例子是0.75 in the numeric(9,3)
列和存储的值是0.750。另一个例子numeric(9,4)
列:我插入值12DB 持有12.0000.
我发现这个相关问题:postgresql 不带尾随零的数字类型。但除了引用 9.x 文档说不添加尾随零之外,它没有提供其他解决方案。从这个问题中,答案引用了文档(我也读过),其中说:
数字值以物理方式存储,没有任何额外的前导或
尾随零。因此,列的声明精度和小数位数
是最大值,而不是固定分配。
然而,就像那个问题海报一样,我看到添加了尾随零。 Hibernate 在日志中生成的原始插入不会显示这种额外的行李。所以我假设这是我没有正确设置的 PostgreSQL 东西,我只是找不到我是如何弄错的。
如果我在这种情况下正确理解“强制”,我想就是这样。这是来自 PostgreSQL 文档:
数字列的最大精度和最大小数位数
可以配置。要声明数字类型的列,请使用以下语法:
NUMERIC(precision, scale)
精度必须为正,小数位数必须为零或正。
或者:
NUMERIC(precision)
选择比例 0。指定:
NUMERIC
没有任何精度或比例创建一列
可以存储任何精度和小数位数的数值,最多
精度的实施限制。这样的专栏不会
将输入值强制为任何特定比例,而数字
具有声明比例的列将强制输入值达到该比例。
大胆强调我的。
原来是这样误导性的稍后在同一部分中:
数值是物理上的存储时没有任何额外的前导或
尾随零。因此,列的声明精度和小数位数
是最大值,不是固定分配.
再次大胆强调我的。
对于精度部分来说可能是这样,但由于在定义比例时它被强制,尾随零被添加到输入值以满足比例定义(如果太大,我会假设被截断)。
我在用精度、规模约束执行的定义。在数据库插入期间,尾随零被添加到数字刻度中,这似乎支持强制转换,并且与不添加尾随零的声明相冲突。
无论正确与否,我都必须在选择后在代码中处理问题。对我来说幸运的是受影响的属性是BigDecimal
所以去掉尾随零很容易(尽管不优雅)。如果有人有更好的建议,不让 PostgreSQL 在插入时向数字刻度添加尾随零,我愿意接受他们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)