我有一个数据库,其中包含存储为浮点数的财务数据。自然地,这可能会在随机时间出现一个真正的问题(例如,当存在无法用浮点算法足够接近地近似的精确值时)。
我的问题是:
- 当您选择字段时,使用会
ALTER TABLE table MODIFY field fixed(10,2)
保留 MySQL 当前显示的固定值吗? - 该值是否有可能是其他的东西?
我有一个数据库,其中包含存储为浮点数的财务数据。自然地,这可能会在随机时间出现一个真正的问题(例如,当存在无法用浮点算法足够接近地近似的精确值时)。
我的问题是:
ALTER TABLE table MODIFY field fixed(10,2)
保留 MySQL 当前显示的固定值吗?
坏消息:我不认为价值会被保留!
我写了这篇文章(2011 年 7 月 25 日),展示了浮点数对转换的敏感程度。
好消息:这是您可以安全地比较数据转换的方法:
如果你的桌子有这些特点
moneytable
moneyfield
moneyid
然后运行这些命令:
这是底线: 如果查询返回任何行,
LEFT JOIN
则转换将是错误的。您将不得不修改 的定义moneyfield
,重新加载moneytabletest
表,并LEFT JOIN
一次又一次地运行查询,直到查询没有返回任何行LEFT JOIN
。一旦返回零 (0) 行,您就会知道哪种转换是安全的。试试看 !!!
根据 Rolando 的回答,我想出了一个更简单的方法来进行分阶段转换,然后进行比较。在有问题的表中,我首先添加了一个相同类型的新字段。我镜像了这些值,运行了转换,并比较了结果值。例如,因为
Amount float(10,2) NOT NULL
我用过:令人惊讶的是,有几个表(一些超过 30k 行),只有一个值不匹配。幸运的是,该特定记录上设置了已删除标志,因此无论如何它都无关紧要。因此,在获得有利的结果后,最后一步是两个命令:
编辑:零停机时间的替代方法是删除
AmountStaged
列并转换Amount
列,因为转换应该与我们运行测试的转换相同。感谢以上所有答案!
我总共有超过 130、972 行,其中有几个浮点列,其中包含类似货币的数据。所以今天我需要将这些列转换为十进制,因为我们在精度方面遇到了一些问题。我使用了上述解决方案之一,但结果并不完全符合我的需要,正如作者所说:
另一个很幸运,差异记录被标记为已删除......在我的情况下,在此操作之后:
...我有 87 行,不匹配。所以我决定像这样更新它:
好吧,在那之后我得到了我需要的一切。
float_price
从eq 到 的所有四舍五入的数据dummy_price
,我认为已经足够了。我想我会帮助某人。