在我的一个Symfony应用程序中,我遇到了教义ODM的奇怪行为。我想要做的只是将十进制类型的数据保存到我们的Informix数据库中。每当我尝试这样做时,十进制分隔符后面的所有内容都会被裁剪。
我尝试了几种分配数据的方法,例如:
数据库中的结果始终为: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-此主题没有区别。
感谢您的帮助!
答案 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数据类型以查看结果?