好吧,所以我知道有很多文章都说我不应该使用DOUBLE在MySQL数据库上存储钱,否则我最终会遇到棘手的精确错误.重点是我不是在设计一个新的数据库,我是在寻找优化现有系统的方法.新版本包含783个双类型列,其中大多数用于存储货币或计算货币金额的公式.

因此,我对这个问题的第一个看法是,我应该强烈建议在下一个版本中将DOUBLE转换为DECIMAL,因为MySQL文档和所有人都这么说.但我找不到任何好的理由来证明这一建议的合理性,原因有三:

  • 我们不会对数据库进行任何计算.所有操作都是在Java中使用BigDecimal完成的,MySQL只是用作结果的普通存储.
  • 双精度a提供的15位精度已经足够了,因为我们存储的金额主要是2位小数,偶尔也有小数字是8位小数作为公式参数.
  • 我们有6年的生产记录,由于MySQL方面的精度损失,没有已知的错误问题.

即使在一个1800万行的表上执行一些操作,比如求和和和复数乘法,我也不能执行一个缺乏精确性的错误.实际上,我们在生产中并没有这样做.我可以通过这样做来显示精度损失

SELECT columnName * 1.000000000000000 FROM tableName;

但我想不出一个办法,把它变成小数点后第二位的错误.我在互联网上发现的大多数真实问题都是2005年及更老的论坛条目,我无法在5.0.51 MySQL服务器上复制它们.

所以,只要我们不执行任何SQL算术运算(我们不打算这么做),那么我们只在一个双栏中存储和检索一个金额,有什么问题吗?

推荐答案

实际上完全不同.双重原因会导致取整问题.如果你做0.1 + 0.2个,它会给你0.30000000000000004个.我个人不相信使用浮点数学的金融数据.影响可能很小,但谁知道呢.我宁愿拥有我所知道的可靠数据,而不是近似的数据,尤其是当你处理货币价值时.

Mysql相关问答推荐

MYSQL子查询

筛选器中的Case When语句

找出同一表中列A中的每个值在列B中出现的次数

MySQL RDS ALTER TABLE ENUM短暂中断了我的数据库连接

如何跨多个产品查找相同时间范围的数据集

Python MySQL-无法从数据库中删除行

使用触发器markdown 10%

从 NextJS/Prisma 添加用户 ID (FK) 到 MySQL 表

mysqli 无法以非 root 用户身份连接

如何解码存储在带有type*:前缀的base64中的数据?

任何值的 SQL WHERE 子句?

基于关系的每个实体有一个真值和多个假值

谁能帮我优化where子句

如何在不使用子查询的情况下按最小日期计算新用户?

在一个 SQL 查询中对同一列中相同类型的不同值求和

Select 多列但仅按 1 列分组

如何在mysql中连接整数(整数和整数)和varchar(nvarchar和varchar)等数据类型?

MySQL行格式:固定和动态之间的区别?

MySQL 删除多列

将mysql查询输出存储到shell变量中