在解决问题之前,我们要先了解一下mysql的严格模式和非严格模式,有兴趣可以自己查看一下官方文档
顾名思义,就是比非严格模式更为严格,主要就是对数据的要求更为严格,比如数据的类型,长度,格式等。比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了char或varchar类型的字段,当写入或更新的数据超过了定义的长度也不会报错。还有一些关于null的数据问题,也可能是因为严格模式造成的,不过我没遇到过,就跳过这个问题┓( ´∀` )┏
个人推荐,开启严格模式,毕竟也算是对我们代码的一种测试,严格一点总好过项目完成后出问题再大改好。
首先,通过
SELECT @@GLOBAL.sql_mode; //查看MySQL的全局模式
SELECT @@SESSION.sql_mode; //查看MySQL的当前连接的模式,如果当前连接模式与全局模式不一致,关闭连接后再连接就一致了
这两个语句查看你是否处于严格模式,如果查询结果中有
STRICT_TRANS_TABLES
这个类型就代表你开启了严格模式(看了别人的文章貌似还要跟ONLY_FULL_GROUP_BY组合才算?这个不清楚)
如果没有,就可以通过以下两种方式打开严格模式:
找到mysql安装目录下的my.cnf(windows系统则是my.ini)文件
在sql_mode中加入STRICT_TRANS_TABLES则表示开启严格模式,如没有加入则表示非严格模式,修改后重启mysql即可
先查看一下当前你的sql_mode,然后复制查询结果,把STRICT_TRANS_TABLES加到开头就可以了
执行以下两个语句中的一个,根据自身情况修改(推荐了解一下这些变量,都挺容易记的,记住了就可以按需使用了):
SET GLOBAL sql_mode = STRICT_TRANS_TABLES,你的查询结果;
SET SESSION sql_mode = STRICT_TRANS_TABLES,你的查询结果;
执行
SELECT @@SESSION.sql_mode; //查看MySQL的当前连接的模式,如果当前连接模式与全局模式不一致,关闭连接后再连接就一致了
查询结果中有NO_ZERO_DATE和NO_ZERO_IN_DATE,就是我们日期不能设为0000-00-00的原因了
只要通过修改mysql的模式就可以了,参照上面的设置方法,根据自己情况选择session还是global,把这两个变量去掉就可以了。
此处贴一下官方的介绍:
该NO_ZERO_DATE模式会影响服务器是否允许 '0000-00-00’作为有效日期。它的效果还取决于是否启用了严格的SQL模式。
NO_ZERO_DATE已弃用。NO_ZERO_DATE 不是严格模式的一部分,但应与严格模式一起使用,默认情况下启用。如果NO_ZERO_DATE启用但未启用严格模式,则会发出警告, 反之亦然。
因为NO_ZERO_DATE已弃用,它将在未来的MySQL版本中作为单独的模式名称删除,其效果包含在严格SQL模式的效果中。
该NO_ZERO_IN_DATE模式会影响服务器是否允许年份部分为非零但月份或日期部分为0的日期。(此模式会影响日期,例如’2010-00-01’或 ‘2010-01-00’,但不会 ‘0000-00-00’。要控制服务器是否允许’0000-00-00’,请使用 NO_ZERO_DATE模式。)效果的NO_ZERO_IN_DATE 还取决于是否启用严格的SQL模式。
NO_ZERO_IN_DATE已弃用。 NO_ZERO_IN_DATE不是严格模式的一部分,但应与严格模式一起使用,默认情况下启用。如果NO_ZERO_IN_DATE启用但未启用严格模式,则会发出警告, 反之亦然。
因为NO_ZERO_IN_DATE已弃用,它将在未来的MySQL版本中作为单独的模式名称删除,其效果包含在严格SQL模式的效果中。
机翻见谅,不过大概是能看懂的,最后的意思大概是,这两个属性将会被删除,以后将直接包含在严格模式中了,也就是说以后的mysql开启了严格模式就没办法设置0000-00-00 00:00:00了