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"

保存文件,重启数据库后问题解决。