<强>现象:强> MySQL5.7版本之后,日期,datetime类型设置默认值“0000-00-00”,出现异常:无效的默认值为“时间”
<强>原因:强>在命令行窗口查看当前的sql_mode配置:
选择@@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_IN_DATE, NO_ZERO_DATE两个选项禁止了0000这样的日期和时间,因此在mysql的配置文件中,重新设置sql_mode,去掉这两项就可以了。
<强> 1。windows系统下:强>
使用设置(会话|全球)sql_mode=澳J健?br/>
注意:会话(默认选项):表示当前回话中生效;全球(需重启):表示全局生效
也可以修改我的。ini配置文件
* * * 演示: 集全球sql_mode=' ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION” >之前 ,<强> 1. linux系统下:强>
文修改my . cnf中所做件,在(mysqld)中添加
代码如下:sql模式=ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
修改完成一定重启MySQL
<强> 2。Mac系统下:强>
在MacOS中默认是没文有my . cnf中所做件,如果需要对MySql进行定制,拷贝/usr/地方/MySql/支持文件/目录,中任意一个.cnf文件。笔者拷贝的是my-default.cnf,将它放到其他目录,按照上面修改完毕之后,更名,为my . cnf中所做然后拷贝到/etc目录再重启下MySql就大功告成了。
<强> sql_mode常用值说明强>
1。SQL语法支持类
<李> ONLY_FULL_GROUP_BY李>
对于GROUP BY聚合操作,如果在选择中的列,拥有或者ORDER BY子句的列,没有在集团中出现,那么这个SQL是不合法的。是可以理解的,因为不在GROUP BY的列查出来展示会有矛盾,在5.7中默认启用,所以在实施5.6升级到5.7的过程需要注意:
<李> ANSI_QUOTES李>
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符,作用与“一样。
设置它以后,更新t组f1="……未知,会报列在“字段列表”这样的语法错误。
<李> PIPES_AS_CONCAT李>
将| |视为字符串的连接操作符而非运算符,这和Oracle数据库是一样的,也和字符串的拼接函数CONCAT()相类似
<李> NO_TABLE_OPTIONS李>
使用显示创建表时不会输出mysql特有的语法部分,如引擎,这个在使用,mysqldump跨DB种类迁移的时候需要考虑
<李> NO_AUTO_CREATE_USER李>
字面意思不自动创建用户。在给MySQL用户授权时,我们习惯使用格兰特……在…对dbus顺道一起创建用户。设置该选项后就与oracle操作类似,授权之前必须先建立用户.5.7.7开始也默认了。
2。数据检查类
<李> NO_ZERO_DATE李>
认为日期“0000-00-00”非法,与是否设置后面的严格模式有关。如果设置了严格模式,则NO_ZERO_DATE自然满足。但如果是插入忽视或忽略更新,“0000-00-00”依然允许且只显示警告2。如果在非严格模式下,设置了NO_ZERO_DATE,效果与上面一样,“0000-00-00”允许但显示警告,如果没有设置NO_ZERO_DATE,没有警告,当做完全合法的值。3。NO_ZERO_IN_DATE情况与上面类似,不同的是控制日期和天,是否可为0,即2010-01-00是否合法。
<李> NO_ENGINE_SUBSTITUTION李>
使用ALTER TABLE或创建表指定引擎时,需要的存储引擎被禁用或未编译,该如何处理。启用NO_ENGINE_SUBSTITUTION时,那么直接抛出错误;不设置此值时,创建用默认的存储引擎替代,atl不进行更改,并抛出一个警告。
<李> STRICT_TRANS_TABLES李>
设置它,表示启用严格模式。
,注意STRICT_TRANS_TABLES不是几种策略的组合,单独指插入、更新出现少值或无效值该如何处理:把“传给int,严格模式下非法,若启用非严格模式则变成0,产生一个警告
范围,变成插入最大边界值详解Mysql数据库日期、datetime类型设置0000-00-00默认值(默认)报错问题