在mysql中从float迁移到decimal的问题

时间:2015-04-02 06:50:13

标签: mysql hibernate migration

我们在mysql中存储了浮动类型的钱,没有定义精度或比例。我们意识到钱不应该存储为浮点数,而应该使用精度和小数位数。现在我们已经定义了十进制(16,6)来存储相同的值。

现在,当我们从float迁移到十进制时,我们看到了不需要的数字。 例如:从应用程序输入的值为0.45,存储为0.45003456浮点类型。当我们迁移到十进制时,它将被存储为0.450034。

问题:那么,有没有办法检索输入的原始值为0.45?并迁移它。

注意:在应用程序中我们正在使用hibernate,它显示正确的值为0.45而不是0.45003456 [我们在此列的hibernate映射中定义为float]

1 个答案:

答案 0 :(得分:0)

不,精度在插入时永久丢失,无法仅使用数据库恢复丢失的信息

我猜你的ORM会丢失精度,因为你描述的行为在直接操作数据库时没有显示:

CREATE TABLE t_source (
    v FLOAT
);
CREATE TABLE t_target (
    v DECIMAL(16,6)
);
INSERT INTO t_source VALUE (0.45);
SELECT * FROM t_source; -- result: 0.45
INSERT INTO t_target SELECT * FROM t_source;
ALTER TABLE t_source MODIFY COLUMN v DECIMAL(16,6);
SELECT * FROM t_source; -- result: 0.450000
SELECT * FROM t_target; -- result: 0.450000

由于您的ORM层在从数据库读取时似乎将更改存储的值恢复为原始值,我会尝试通过此ORM转换值。< / p>


注意:DECIMAL数据库类型应该映射到java.math.BigDecimal Java类型but I have no idea what I am talking about。以下可能有效,也可能无效。

  1. 向表中添加新的十进制列
  2. 将此新列映射为BigDecimal
  3. 每行
    • 通过ORM读取现有值
    • 通过ORM将值写入新列
  4. 删除旧列