Truncated incorrect DOUBLE value: '172.31.27.3'错误原因及解决方案


   昨天晚上,新提交的完整包提交测试,测试的时候发现下发指令的时候,如果下发IP类型的指令,就下发失败,查看java的记录日志的时候,发现报错。

报错内容:Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '172.31.27.3'。

   在百度了N久之后,还是无法定位问题,刚开始还以为是打的包有问题,用上一轮打的程序包重新安装,重新下发,还是遇到一样的问题。一晚上查BUG至深夜,仍然没有解决。

  今天上午,又和同事一起定位这个问题,太要命了,再发布时间还有2天的时候,出了这么个严重的BUG,是要扣分的呀,在千辛万苦的卸载,重装,卸载,重装之后,发现了错误的触发诱因。程序包刚安装完的时候,下发IP类型指令是正常的,之后执行了个脚本,再下发同个指令,就报错了,还是提示Data truncation: Truncated incorrect DOUBLE value: '172.31.27.3'。这下问题好定位了,在阅读脚本内容后,我们对比了下java的相关文件内容,发现执行了脚本之后,文件globalMessages_zh_CN.properties文件中,database.url值被替换了。看下图:

左边是程序包刚安装完时,右边是执行脚本之后


对比可以发现,执行了脚本之后,jdbcCompliantTruncation\=false这个配置不见了。所以导致了报错。


现在这个问题基本上就可以解决了,加上jdbcCompliantTruncation\=false就行。但是,身为一个程序员,不能满足于这种表面上的答案。让我们继续深挖下去吧


现在要知道jdbcCompliantTruncation这个配置项是干嘛用的,用来控制什么?我百度了下:

jdbcCompliantTruncation

连接到支持告警的服务器时(MySQL 4.1.0和更高版本),当按照JDBC的要求截短数据时,驱动程序是否应抛出java.sql.DataTruncation异常?

jdbcCompliantTruncation解释来源:http://my.oschina.net/zimingforever/blog/371571


就是说,这个配置项用来决定,当遇到截断数据时,驱动程序是否抛出异常。这时候猜测,这是sql语句的问题。之后,我在mysql上执行同样的sql语句,发现虽然可以正常执行,但是会有警告。

Truncated incorrect DOUBLE value: '172.31.27.3'错误原因及解决方案_第1张图片

使用 show warnings可以查看上个sql语句执行后产生的错误或者警告。

Truncated incorrect DOUBLE value: '172.31.27.3'错误原因及解决方案_第2张图片

警告内容正好和java报错一样,Truncated incorrect DOUBLE value: XXX。(无视value的值)。

     这时候我们可以发现,mysql本身会无视这些警告,但是如果jdbc连接的时候开启了jdbcCompliantTruncation(默认就是true,除非显式的设置为false才能关闭),就会将警告当做异常抛出。


    到这里就结束了,来个总结吧:个人经验认为,这种报错,基本是sql的语法问题。如果想要判断是否语法问题,建议直接用mysql执行,看下是否有警告。

网上这类错误的资料不多,或许后面也会再遇到,就记录下来,拿来和程序员们分享下。



你可能感兴趣的:(java,mysql)