详解Mysql数据库日期、datetime类型设置0000-00-00默认值(默认)报错问题

  

<强>现象: 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默认值(默认)报错问题