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)
网友评论