十进制数据不能按原则正确存储在数据库中

时间:2018-09-12 07:56:35

标签: php symfony doctrine-orm informix

在我的一个Symfony应用程序中,我遇到了教义ODM的奇怪行为。我想要做的只是将十进制类型的数据保存到我们的Informix数据库中。每当我尝试这样做时,十进制分隔符后面的所有内容都会被裁剪。

我尝试了几种分配数据的方法,例如:

  • $ position-> setFrpProz(1.2345);
  • $ position-> setFrpProz(“ 1.2345”);
  • $ position-> setFrpProz(“ 1,2345”);

数据库中的结果始终为:1.0000

这是实体的yml:

frpProz:
        type: decimal
        nullable: true
        precision: 10
        scale: 4
        column: frp_proz

在Informix中,数据库字段也定义为Decimal(10,4)。

我已经尝试了Doctrine EchoSQLLogger并获得以下结果(短路):

"START TRANSACTION"
UPDATE st_frb_mpos SET frp_proz = ?, [...] WHERE [...]
array(15) {
  [0]=>
  string(6) "1.2345"
                          [...]
}
array(15) {
  [0]=>
  string(7) "decimal"
                          [...]
}
"COMMIT"
"okay"

我真的不知道该怎么解决。我已经尝试从symfony 2.8升级我的应用程序。至3.4.15-此主题没有区别。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您误解了天平的含义。

取自mysql docs

  

精度表示存储值的有效位数,小数位数表示在小数点后可以存储的位数。

因为您已指定10,4,所以数据库仅在该点的右边存储4个小数位。

精度是要存储的总位数。因此10,4将允许您存储诸如123456.7890

之类的值

您存储的所有值将被裁剪为4个小数位。

答案 1 :(得分:0)

尽管在Informix中您将接收列定义为DECIMAL(10,4),但其行为就像您将其定义为DECIMAL(10,0)并将1.2345舍入为1.0000,所以Symfony可能在将其发送到Informix之前将其舍入为1.0000。我怀疑这是怎么回事,因为它在Informix中显示4个十进制零,它是您定义的精度/小数位的有效值。因此,我建议您研究Symfony的frp_proz NumberType字段选项,例如scale和rounding_mode,以查看数字是否在Symfony中进行了转换。

https://symfony.com/doc/current/reference/forms/types/number.html

您是否曾尝试过将其强制转换为CHAR,然后再发送至Informix,或将Informix列定义为FLOAT数据类型以查看结果?