1. 前言
SQL_MODE 定义了 MySQL 支持的 SQL 语法,对数据的校验等,是一个非常重要的系统变量,由一组 MODE 组成,不同的 MODE 控制着 MySQL 不同的行为。如果你遇到了原本可以执行的 SQL,在升级或换一个数据库后不能执行了,一般是由于 SQL_MODE 设置不同引起的。
2. 问题说明
最近一个 MySQL 5.0 的项目升级到了 5.8,导致 SQL 语句执行报错:
#1292 – Incorrect date value: '0000-00-00'
意思是不正确的日期值。经过一番搜索和试验,发现就是插入的值有问题,我们无法修改程序,只好来修改数据库了。
3. 解决方案
查看 SQL_MODE:
select @@sql_mode;
得到的值如下:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
其中 NO_ZERO_DATE
这个模式即不允许 0000-00-00
作为日期值,所以我们取消该模式即可。
打开数据库配置文件 my.ini
,在 [mysqld]
分组下添加:
sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
保存文件,重启数据库后问题解决。