MySQL数据库浮点数据类型的坑

今天在盘点的时候折腾了一次,在创建表的时候么有关注到浮点数的精度问题,导致排查问题浪费了很长时间.
场景:汇总报表,将查出的数据插入另外一张表中,查出来的数据是小数,转成另一张表对应的javabean也是小数,但是在插入数据库之后就成了整数了,说明小数被抹去了,我以为是框架的问题,就问负责框架的人,结果他的测试是按照保留小数点0位来测的,结果跟我同一个效果,经过dba的指点,应该是数据库表浮点字段没有指定精度导致的。
下面就简要说明一下原理。

首先看下面四条创建表的语句:
Sql1:
CREATE TABLE `t_rep_inventory` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `initialnum` decimal(20,2) DEFAULT NULL COMMENT '期初库存数量',
  `endingnum` decimal(20,2) DEFAULT NULL COMMENT '期末库存数量',
  `rechecknum` decimal(20,2) DEFAULT NULL COMMENT '盘点数量',
  `diffnum` decimal(20,2) DEFAULT NULL COMMENT '盘盈/盘亏数量',
  `diffreason` int(11) DEFAULT NULL COMMENT '盘盈/盘亏原因',
  `iccode` varchar(40) DEFAULT NULL COMMENT '盘点单号',
  `starttime` timestamp NULL DEFAULT NULL COMMENT '报表生成开始时间',
  `endtime` timestamp NULL DEFAULT NULL COMMENT '报表生成截止时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=298151 DEFAULT CHARSET=utf8mb4;
Sql2:
CREATE TABLE `t_rep_inventory` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `initialnum` decimal(20,0) DEFAULT NULL COMMENT '期初库存数量',
  `endingnum` decimal(20,0) DEFAULT NULL COMMENT '期末库存数量',
  `rechecknum` decimal(20,0) DEFAULT NULL COMMENT '盘点数量',
  `diffnum` decimal(20,0) DEFAULT NULL COMMENT '盘盈/盘亏数量',
  `diffreason` int(11) DEFAULT NULL COMMENT '盘盈/盘亏原因',
  `iccode` varchar(40) DEFAULT NULL COMMENT '盘点单号',
  `starttime` timestamp NULL DEFAULT NULL COMMENT '报表生成开始时间',
  `endtime` timestamp NULL DEFAULT NULL COMMENT '报表生成截止时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=298151 DEFAULT CHARSET=utf8mb4;

Sql3:
CREATE TABLE `t_rep_inventory` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `initialnum` double(20,0) DEFAULT NULL COMMENT '期初库存数量',
  `endingnum` double (20,0) DEFAULT NULL COMMENT '期末库存数量',
  `rechecknum` double (20,0) DEFAULT NULL COMMENT '盘点数量',
  `diffnum` double (20,0) DEFAULT NULL COMMENT '盘盈/盘亏数量',
  `diffreason` int(11) DEFAULT NULL COMMENT '盘盈/盘亏原因',
  `iccode` varchar(40) DEFAULT NULL COMMENT '盘点单号',
  `starttime` timestamp NULL DEFAULT NULL COMMENT '报表生成开始时间',
  `endtime` timestamp NULL DEFAULT NULL COMMENT '报表生成截止时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=298151 DEFAULT CHARSET=utf8mb4;

Sql4:
CREATE TABLE `t_rep_inventory` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `initialnum` double(20,0) DEFAULT NULL COMMENT '期初库存数量',
  `endingnum` double (20,0) DEFAULT NULL COMMENT '期末库存数量',
  `rechecknum` double (20,0) DEFAULT NULL COMMENT '盘点数量',
  `diffnum` double (20,0) DEFAULT NULL COMMENT '盘盈/盘亏数量',
  `diffreason` int(11) DEFAULT NULL COMMENT '盘盈/盘亏原因',
  `iccode` varchar(40) DEFAULT NULL COMMENT '盘点单号',
  `starttime` timestamp NULL DEFAULT NULL COMMENT '报表生成开始时间',
  `endtime` timestamp NULL DEFAULT NULL COMMENT '报表生成截止时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=298151 DEFAULT CHARSET=utf8mb4;
能看到区别吗?

总结:在使用浮点型数据类型进行业务处理的时候一定要注意bean的类型与数据库类型一致,并且保留精度要明确。当初建立表的时候没有设置,默认为0导致出现问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值