当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL将尾随零添加到数值

陆文博
2023-03-14

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

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

我发现了这个相关的问题:没有尾随零的postgresql数字类型。但除了引用9.x文档中说没有添加尾随零之外,它没有提供其他解决方案。从这个问题,答案引用了文件(我也读过),其中说:

数值是物理存储的,没有任何额外的前导或尾随零。因此,列的声明精度和比例是最大值,而不是固定的分配。

然而,就像那个问题海报一样,我看到后面添加了零。Hibernate在日志中生成的原始插入没有显示这个额外的行李。所以我假设这是一个我没有正确设置的PostgreSQL东西,我只是不知道我是怎么把它弄错的。

共有3个答案

奚瑾瑜
2023-03-14

您可以使用PostgreSQL v13上的trim_scale函数去除训练零点。这将减少数字的存储大小。

贝礼骞
2023-03-14

如果指定精度和刻度,则Pg会根据该精度和刻度进行填充。

regress=> SELECT '0'::NUMERIC(8,4);
 numeric 
---------
  0.0000
(1 row)

没有办法把它关掉。它仍然是相同的数字,精度是由类型定义的,而不是由值定义的。

如果要使用该值定义精度,必须使用无约束的数值

regress=> SELECT '0'::NUMERIC, '0.0'::NUMERIC;
 numeric | numeric 
---------+---------
       0 |     0.0                                                                                                                                                             
(1 row)                                                                                                                                                                        

张浩阔
2023-03-14

如果我在这个背景下正确理解“胁迫”,我想就是这样了。这是来自PostgreSQL文档:

可以配置数字列的最大精度和最大刻度。要声明numeric类型的列,请使用以下语法:

NUMERIC(precision, scale)

精度必须为正,刻度为零或正。或者:

NUMERIC(precision)

选择0的刻度。指定:

NUMERIC

如果没有任何精度或刻度,将创建一个列,其中可以存储任何精度和刻度的数值,直至精度的实现限制。这种类型的列不会强制输入值到任何特定的刻度,而具有声明刻度的数字列将强制输入值到该刻度。

大胆强调我的。

因此,在同一部分的后面,这是误导性的:

数值是物理存储的,没有任何额外的前导或尾随零。因此,列的声明精度和比例是最大值,而不是固定的分配。

再次大胆强调我的。

这可能适用于精密零件,但由于定义比例时强制执行该比例,因此会将尾随零添加到输入值以满足比例定义(如果太大,我会假设截断)。

我正在使用精确的缩放定义来实现约束。在DB插入期间,尾随零被添加到数字标度中,这似乎支持强制,并与不添加尾随零的声明相冲突。

不管正确与否,我必须在选择后用代码处理这个问题。幸运的是,受影响的属性是BigDecimal,因此剥离尾随的零很容易(尽管不是很优雅)。如果有人有更好的建议,不让PostgreSQL在插入时向数字刻度添加尾随零,我愿意接受他们。

 类似资料:
  • 本文向大家介绍将尾随零添加到Python字符串,包括了将尾随零添加到Python字符串的使用技巧和注意事项,需要的朋友参考一下 作为数据处理活动的一部分,有时我们需要在一个字符串后附加另一个字符串。在本文中,我们将看到如何将动态零数字附加到给定的字符串。可以通过使用以下程序中所示的各种字符串函数来完成此操作。 使用ljust和len Python字符串方法返回以长度为宽度的字符串左对齐的字符串。使

  • 我是C编程新手,我想找出给定数的阶乘中尾随零的数量 我尝试计算数字的模,它将返回给定数字的最后一位作为余数,然后将删除最后一个数字。 执行程序后,输出总是将尾随零的数量显示为“0”,如果(ln=!0)条件始终得到满足,即使存在零。

  • 我试图计算给定数字的阶乘中尾随零的数量,例如。, ,其中尾随零 ,其中尾随零 我的问题是,我有一个像df这样的数据帧 我知道R中的阶乘是用来计算阶乘的,但我不知道如何计算尾部的零。任何帮助都将不胜感激!

  • 问题内容: 所以我在Python3.5上使用psycopg2将一些数据插入到postgresql数据库中。我想做的是有两列是字符串,最后一列只是一个dict对象。我不需要搜索字典,只需能够将其从数据库中拉出并使用它即可。 因此例如: 这有可能吗,如果可以的话,我将如何去做呢? 问题答案: 如果您的PostgreSQL版本足够新(9.4+)并且psycopg版本> = 2.5.4,则所有键都是字符串

  • 问题内容: 我正在尝试计算阶乘产生的数字的尾随零(这意味着数字变得很大)。以下代码采用一个数字,计算该数字的阶乘,并计算尾随零。但是,当数字大约为25!时,numZeros将不起作用。 我并不担心这段代码的效率,并且我知道有多种方法可以使这段代码的效率更好。我要弄清楚的是为什么计数大于25的数字结尾的零!不管用。 有任何想法吗? 问题答案: 您的任务不是计算阶乘,而是计算零的数量。一个好的解决方案

  • 问题内容: 我有字符串(来自DB),其中可能包含数字值。如果它包含数值,我想删除尾随零,例如: ,仅适用于第一个,而不适用于第二个。 很多答案都指向使用,但是我得到的可能不是数字。因此,我认为更好的解决方案可能是通过Regex。 问题答案: 有可能: 我懒又傻,只是 使用相同的解决方案,而不是某些注释中提到的,以便于理解