mysqljdbc处理0日期格式蛋疼问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysqljdbc处理0日期格式蛋疼问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2481字,纯文字阅读大概需要4分钟。
内容图文
最近在写一个数据库访问的中间平台时,使用MySQL JDBC处理一些日期数据,遇到点变态的问题,给大家乐一乐! 首先来看看什么样的日期数据这么蛋疼呢? DATE 0000-00-00 DATETIME 0000-00-00 00:00:00 TIMESTAMP 0000-00-00 00:00:00 TIME 25:21:22 对于前3种
最近在写一个数据库访问的中间平台时,使用MySQL JDBC处理一些日期数据,遇到点变态的问题,给大家乐一乐!
首先来看看什么样的日期数据这么蛋疼呢?
DATE 0000-00-00
DATETIME 0000-00-00 00:00:00
TIMESTAMP 0000-00-00 00:00:00
TIME 25:21:22
对于前3种情况,直接用JDBC读取,肯定会报错,报错信息类似这样:
Value '0000-00-00' can not be represented as java.sql.Date
或者
Value '0000-00-00' can not be represented as java.sql.Timestamp
为什么?日期值即使是0,也对应到1970-01-01,这种变态的日期格式,不知道那个奇人想出来的。
对于这样的问题,很多小伙伴想到的第一种办法就是在jdbc url参数上设置一个:zeroDateTimeBehavior=convertToNull
便可以让Java程序不报错了!因为JDBC内部发现是0日期格式,则会转换为null返回。
验证中确实可以解决问题,但是,但是,某个用户的数据库就是写入了这样的一条数据,但是程序确返回了null,用户认为这并不是他想要的数据(例如在做数据迁移时,目标字段不可空,此时就会报错),用户就希望看到的是0000-00-00这样格式的数据。怎么办呢?
首先必须是将参数zeroDateTimeBehavior=convertToNull去掉,否则程序拿到的始终是null,根本不知道数据库的数据是什么。但是这样程序会报错,不论用getString还是getObject都会报错。
经过验证,发现getBytes()不会报错,然后通过得到的bytes[]数组,new String(bytes[])就可以得到一个这样的字符串,并且与数据库内一致。似乎问题解决了?
没有,更蛋疼的问题出现了,当JDBC启用流模式或游标模式时,getBytes()也会报同样的错误,经过验证发现get各种类型都会报错,这尼玛太蛋疼了,没空看源码,据我估计,MySQL JDBC在流模式和游标模式中,对结果集的某些类型转换处理,没有复用普通模式(默认是本能地静态数据)的处理代码导致了这样的问题。
但是对于某些大数据的处理,业务应用中必须启用流模式或游标模式,因此陷入了一个死套--因此我认为这是MySQL JDBC的一个BUG。
但是用户的问题必须要解决,为此,不得不去用一下特殊的处理方式,异常判定,我想你看到这里应该认为这是世界上最土的办法了,呵呵!也就是捕获上面描述的Message信息,若发现则认为是0日期格式来解决,准备提交官方BUG,希望尽快能修复吧。
最后来说说Time类型,MySQL这个蛋疼的Time类型是指时长,而不是指日期上的小时:分钟:秒,因此它的小时数是可以超过24的,但是这样的值让Java来解析就会报错,因此对于MySQL的Time类型处理的时候未了避免问题。通常用getBytes()方式来获取值,然后用new String(byte[])来得到具体值,当然先要判空。
内容总结
以上是互联网集市为您收集整理的mysqljdbc处理0日期格式蛋疼问题全部内容,希望文章能够帮你解决mysqljdbc处理0日期格式蛋疼问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。