欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

科学计数法入库问题

程序员文章站 2022-07-13 09:10:37
...

 最近在做项目时遇到一个问题,同一个方法中两次更新入库,其中一次成功,一次没执行。我先是排查应用程序日志,发现程序日志并没有异常,然后根据执行时间查了mysql的binlog日志。

binlog日志查看脚本如下:

/usr/local/mysql/bin/mysqlbinlog -v --start-datetime='2018-12-26 17:55:00' 
--stop-datetime='2018-12-26 17:57:00' logs/mysql-bin.000004 >/tmp/tmp.sql

 binlog日志显示确实只执行了一次更新操作

### UPDATE `user_currency`
### WHERE
###   @1=15
###   @2=203
###   @3=17
###   @4=318.2131053694
###   @5=287.7714971818
###   @6=30.4416081876
###   @7='2018-12-26 17:39:57'
### SET
###   @1=15
###   @2=203
###   @3=17
###   @4=348.4720639080
###   @5=318.0304557204
###   @6=30.4416081876
###   @7='2018-12-26 17:39:57'
# at 14487394
 update user_currency set available_money = available_money + ?, where user_id = ? and currency_id = ? 
update user_currency set available_money = available_money + ?, where user_id = ? and currency_id = ? 
update user_currency set available_money = available_money + ?, where user_id = ? and currency_id = ? 
update user_currency set available_money = available_money + ?, where user_id = ? and currency_id = ? 

对应参数分别是:
0E-20(BigDecimal), 49(Long), 17(Long), 
2.7377658553(BigDecimal), 49(Long), 4(Long)
23.30465650830011440000(BigDecimal),59(Long), 17(Long)
0(BigDecimal), 59(Long), 4(Long)

 

我将两次的更新合并到一起,改为批量操作,并且在测试环境开启了sql日志打印。第二天测试部门反馈还是存在这个问题。我把当天的日志拉出来比对,发现在批量更新时sql是有的,奇怪的是其中一个sql中的某个数值是科学计数法。

 

 问题终于找到了,那解决问题就简单多了。mysql是弱类型,直接将科学计数法转成字符串即可解决问题。

相关标签: java sql