mysql date '0000-00-00' occur error in java orm

Introduction

因为程序中可能出现不知道birthday时,会设置此字段为'', 当insert到数据库后,出现了birthday为
'0000-00-00', 后期java程序读取数据后,进行orm映射时出现birthday字段(data类型)映射失败,导致
程序异常。

  • 数据表格式样例
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
created_at timestamp NO CURRENT_TIMESTAMP
updated_at timestamp NO CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
age tinyint(4) NO 0
name varchar(50) NO
birthday date NO 1970-01-01
  • insert语句
    insert into person(name, age, birthday) values('frank3', 35, '')
id created_at updated_at age name birthday
1 2018-01-19 11:12:36 2018-01-19 11:12:36 35 frank3 0000-00-00

Reason

发生此问题到原因,已经很明了了,就是对date类型插入了错误的数据,正好java orm不支持date类型
为'0000-00-00'这样的数据。


Resolve

在程序的世界里,解决任何问题,都可以条条大路通罗马,但是我们都会选取合适当前境遇的解决方案;
我们的解决方案是mysql replace 函数,因为改动源头的工作量远远超过添加一个replace的代价。

  • java读取数据是对birthday字段时做处理

select id,created_at,updated_at,age,name,replace(birthday, '0000-00-00', '1970-01-01') as birthday from person;

id created_at updated_at age name birthday
1 2018-01-19 11:12:36 2018-01-19 11:12:36 35 frank3 1970-01-01

Tips

  • 感谢@yujun发现此问题
  • 此解决方案并非最好的解决方案,但是确实当时环境下最快的解决方案
  • 同时这个问题提醒我们在使用mysql时对date字段'0000-00-00'提前做处理
  • 你可能会对mysql的coalesce函数感兴趣,这个函数是处理NULL的(不过还是建议mysql不要设置NULL)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,077评论 6 13
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 9,483评论 0 19
  • 为什么我的简历没有回音,是一个古老而又永恒的问题。其实答案只有一个,你被自己的简历出卖了。再说的直白一点,你在写简...
    阿布豆球阅读 1,531评论 0 1
  • 不止从一个人或者几个人口中提到永生233这支钢笔出奇的好用,再加上这种富有二次元味道的名字,这次终于鼓足勇气,买了...
    nonozone阅读 11,025评论 0 1
  • 故事的结尾,是相约晚秋高地,但是故事的结局,应该和洛枳盛淮南一样,不管中间经历了多少事情,错过了多久的时光,哪怕最...
    Dabora阅读 1,211评论 0 0

友情链接更多精彩内容