美文网首页
mysql date '0000-00-00' occur er

mysql date '0000-00-00' occur er

作者: frank3 | 来源:发表于2018-01-19 11:42 被阅读0次

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)

相关文章

网友评论

      本文标题:mysql date '0000-00-00' occur er

      本文链接:https://www.haomeiwen.com/subject/pqsooxtx.html