美文网首页
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