1.问题现象
我的MySQL版本是5.7.24,执行sql语句时报错:
查看了一下执行的sql建表语句,其中时间endtime部分如下图:
2.分析原因
执行SQL语句:
SELECT @@sql_mode;
搜索出来我的mysql的sql_mode如下图:
发现搜索的sql_model中含有STRICT_TRANS_TABLES(存储引擎启用严格模式,非法数据值被拒绝), NO_ZERO_IN_DATE,NO_ZERO_DATE。所以在严格模式下,不允许日期和月份为零。
NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零
NO_ZERO_DATE:认为日期 ‘0000-00-00’ 非法,与是否设置后面的严格模式有关。
- 如果设置了严格模式,则 NO_ZERO_DATE 自然满足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允许且只显示warning。
- 如果在非严格模式下,设置了NO_ZERO_DATE,效果与上面一样,’0000-00-00’允许但显示warning;如果没有设置NO_ZERO_DATE,no warning,当做完全合法的值。
- NO_ZERO_IN_DATE情况与上面类似,不同的是控制日期和天,是否可为 0 ,即 2010-01-00 是否合法。
3.解决方法
1.执行sql语句:
SET @@global.sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
2.因为设置global,所以需要重启MySQL才会生效。