gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:32:00 26 4
gpt4 key购买 nike

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

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

问题:那么,有没有办法取回输入的原始值 0.45?并进行迁移。

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

最佳答案

不,插入时精度永久丢失仅通过数据库无法恢复丢失的信息。

我猜你的 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 转换值。


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

  1. 在您的表中添加一个新的小数列
  2. 将这个新列映射为 BigDecimal
  3. 每一行
    • 通过ORM读取已有值
    • 通过ORM将值写入新列
  4. 删除旧列

关于mysql - 在 mysql 中从 float 迁移到 decimal 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29406755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com