mysql⽇期时间设置默认0000-00-0000:00:00出错
在解决问题之前,我们要先了解⼀下mysql的严格模式和⾮严格模式,有兴趣可以⾃⼰查看⼀下
严格模式
顾名思义,就是⽐⾮严格模式更为严格,主要就是对数据的要求更为严格,⽐如数据的类型,长度,格式等。⽐如⼀个整型字段我们写⼊⼀个字符串类型的数据,在⾮严格模式下MySQL不会报错,同样如果定义了char或varchar类型的字段,当写⼊或更新的数据超过了定义的长度也不会报错。还有⼀些关于null的数据问题,也可能是因为严格模式造成的,不过我没遇到过,就跳过这个问题┓( ´∀` )┏
个⼈推荐,开启严格模式,毕竟也算是对我们代码的⼀种测试,严格⼀点总好过项⽬完成后出问题再⼤改好。
⾸先,通过
SELECT @@GLOBAL.sql_mode;      //查看MySQL的全局模式
SELECT @@SESSION.sql_mode;      //查看MySQL的当前连接的模式,如果当前连接模式与全局模式不⼀致,关闭连接后再连接就⼀致了
这两个语句查看你是否处于严格模式,如果查询结果中有
STRICT_TRANS_TABLES
这个类型就代表你开启了严格模式(看了别⼈的⽂章貌似还要跟ONLY_FULL_GROUP_BY组合才算?这个不清楚)
如果没有,就可以通过以下两种⽅式打开严格模式:
下载mysql为什么下载不了1.修改配置⽂件
到mysql安装⽬录下的myf(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了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。