mysql日期时间设置默认0000-00-00 00:00:00出错

在解决问题之前,我们要先了解一下mysql的严格模式和非严格模式,有兴趣可以自己查看一下官方文档

严格模式

顾名思义,就是比非严格模式更为严格,主要就是对数据的要求更为严格,比如数据的类型,长度,格式等。比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下MySQL不会报错,同样如果定义了char或varchar类型的字段,当写入或更新的数据超过了定义的长度也不会报错。还有一些关于null的数据问题,也可能是因为严格模式造成的,不过我没遇到过,就跳过这个问题┓( ´∀` )┏

个人推荐,开启严格模式,毕竟也算是对我们代码的一种测试,严格一点总好过项目完成后出问题再大改好。

首先,通过

SELECT @@GLOBAL.sql_mode;       //查看MySQL的全局模式
SELECT @@SESSION.sql_mode;      //查看MySQL的当前连接的模式,如果当前连接模式与全局模式不一致,关闭连接后再连接就一致了

这两个语句查看你是否处于严格模式,如果查询结果中有

STRICT_TRANS_TABLES

这个类型就代表你开启了严格模式(看了别人的文章貌似还要跟ONLY_FULL_GROUP_BY组合才算?这个不清楚)

如果没有,就可以通过以下两种方式打开严格模式:

1.修改配置文件

找到mysql安装目录下的my.cnf(windows系统则是my.ini)文件
在sql_mode中加入STRICT_TRANS_TABLES则表示开启严格模式,如没有加入则表示非严格模式,修改后重启mysql即可

2.在查询中设置

先查看一下当前你的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,把这两个变量去掉就可以了。

还有一个方法,不过无法设置默认值,只能在修改数据时生效,就是将INSERT换成INSERT INGORE,UPDATE换成UPDATE INGORE,不过这样会导致错误的数据也可以进入数据库,不推荐使用

 
 
 

此处贴一下官方的介绍:

  • NO_ZERO_DATE

该NO_ZERO_DATE模式会影响服务器是否允许 '0000-00-00’作为有效日期。它的效果还取决于是否启用了严格的SQL模式。

    • 如果未启用此模式, '0000-00-00’则允许并且插入不会产生警告。
    • 如果启用此模式,‘0000-00-00’ 则允许并且插入产生警告。
    • 如果启用此模式和严格模式, '0000-00-00’则不允许插入产生错误,除非 IGNORE同时给出。对于 INSERT IGNORE和UPDATE IGNORE,'0000-00-00’允许和插入产生警告。

NO_ZERO_DATE已弃用。NO_ZERO_DATE 不是严格模式的一部分,但应与严格模式一起使用,默认情况下启用。如果NO_ZERO_DATE启用但未启用严格模式,则会发出警告, 反之亦然。

因为NO_ZERO_DATE已弃用,它将在未来的MySQL版本中作为单独的模式名称删除,其效果包含在严格SQL模式的效果中。

  • NO_ZERO_IN_DATE

该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模式。

    • 如果未启用此模式,则允许零件的日期,并且插入不会产生警告。
    • 如果启用此模式,则插入零件的日期’0000-00-00’并生成警告。
    • 如果启用此模式和严格模式,则不允许零件的日期,并且插入会产生错误,除非IGNORE同时给出。对于INSERT IGNORE和 UPDATE IGNORE,插入零件的日期’0000-00-00’并生成警告。

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了

你可能感兴趣的:(MySQL,数据库)