MySql Error: '0000-00-00 00:00:00' for column 'date' at row 1

错误:

先上错误信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
2019/1/9 下午2:48:35Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '0000-00-00 00:00:00' for column 'date' at row 1
2019/1/9 下午2:48:35 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3971)
2019/1/9 下午2:48:35 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
2019/1/9 下午2:48:35 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
2019/1/9 下午2:48:35 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
2019/1/9 下午2:48:35 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2497)
2019/1/9 下午2:48:35 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2455)
2019/1/9 下午2:48:35 at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:839)
2019/1/9 下午2:48:35 at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:739)
2019/1/9 下午2:48:35 at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95)
2019/1/9 下午2:48:35 at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
2019/1/9 下午2:48:35 at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:307)
2019/1/9 下午2:48:35 ... 36 common frames omitted

环境及复现

发生这个问题的操作是:表中新加了几个列

猜测1,不合法数据的问题

从错误信息来看似乎是数据上的问题,’date’列有’0000-00-00’ 这样的不合法数据;

结合新加字段的逻辑,mysql会把表重新生成一张临时表,并且加入新列,再重新插入数据,符合上面的说法,有不合法数据。

检查一下:

并没有!!
猜测2,安全配置的问题

查看mode的配置

1
show variables like 'sql_mode';

参数比较多,关注一下里面两个参数,全参数mysql原文链接

  • NO_ZERO_DATE
  • NO_ZERO_IN_DATE

再检查一下date列有什么稀奇的:

看来就是这两个参数和这个默认设置 (为什么会设置成这样?历史遗留) 引发的错误。

解决

问题已经查到了,修改这个安全配置即可。

1
set global sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

特别注意的是:

date列无论有没有数据,只要有这个默认值’0000-00-00’,都无法通过安全配置

解决方案借鉴

https://blog.csdn.net/wzyyc/article/details/76177523