• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    详解Mysql数据库date, datetime类型设置0000-00-00默认值(default)报错问题

    现象:MySQL5.7版本之后,date, datetime类型设置默认值"0000-00-00",出现异常:Invalid default value for 'time'

    原因:在命令行窗口查看当前的sql_mode配置:

    select @@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, and NO_ENGINE_SUBSTITUTION 

    其中NO_ZERO_IN_DATE, NO_ZERO_DATE两个选项禁止了0000这样的日期和时间。因此在mysql的配置文件中,重新设置sql_mode,去掉这两项就可以了。

    解决办法

    1.windows系统下:

    使用 SET [SESSION|GLOBAL] sql_mode='modes'

    注意:SESSION(默认选项):表示当前回话中生效;GLOBAL(需重启):表示全局生效

    也可以修改my.ini配置文件

    ***
    演示: 
        SET GLOBAL 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-mode=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/local/mysql/support-files/目录 中任意一个.cnf 文件。笔者拷贝的是my-default.cnf,将它放到其他目录,按照上面修改完毕之后,更名为my.cnf,然后拷贝到/etc目录再重启下mysql就大功告成了。

    sql_mode模式问题拓展

    sql_mode 常用值说明

    1.SQL语法支持类

    对于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的。是可以理解的,因为不在 group by 的列查出来展示会有矛盾。 在5.7中默认启用,所以在实施5.6升级到5.7的过程需要注意:

    启用 ANSI_QUOTES 后,不能用双引号来引用字符串,因为它被解释为识别符,作用与 ` 一样。

    设置它以后,update t set f1="" ...,会报 Unknown column ‘' in ‘field list 这样的语法错误。

    将 || 视为字符串的连接操作符而非运算符,这和Oracle数据库是一样的,也和字符串的拼接函数 CONCAT() 相类似

    使用 SHOW CREATE TABLE 时不会输出mysql特有的语法部分,如 ENGINE ,这个在使用 mysqldump 跨DB种类迁移的时候需要考虑

    字面意思不自动创建用户。在给MySQL用户授权时,我们习惯使用 GRANT ... ON ... TO dbuser顺道一起创建用户。设置该选项后就与oracle操作类似,授权之前必须先建立用户。5.7.7开始也默认了。

    2.数据检查类

    认为日期 ‘0000-00-00' 非法,与是否设置后面的严格模式有关。 1.如果设置了严格模式,则 NO_ZERO_DATE 自然满足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,'0000-00-00'依然允许且只显示warning 2.如果在非严格模式下,设置了NO_ZERO_DATE,效果与上面一样,'0000-00-00'允许但显示warning;如果没有设置NO_ZERO_DATE,no warning,当做完全合法的值。3.NO_ZERO_IN_DATE情况与上面类似,不同的是控制日期和天,是否可为 0 ,即 2010-01-00 是否合法。

    使用 ALTER TABLE或CREATE TABLE 指定 ENGINE 时, 需要的存储引擎被禁用或未编译,该如何处理。启用NO_ENGINE_SUBSTITUTION时,那么直接抛出错误;不设置此值时,CREATE用默认的存储引擎替代,ATLER不进行更改,并抛出一个 warning。

    设置它,表示启用严格模式。

     注意 STRICT_TRANS_TABLES 不是几种策略的组合,单独指 INSERT、UPDATE出现少值或无效值该如何处理: 把 ‘' 传给int,严格模式下非法,若启用非严格模式则变成0,产生一个warning
    Out Of Range,变成插入最大边界值

    A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition

    mysql5.0以上版本支持三种sql_mode模式: set @@sql_mode=xxx模式名;

    我们常设置的 sql_mode 是 ANSI、STRICT_TRANS_TABLES、TRADITIONAL,其中ANSI和TRADITIONAL是上面的几种组合。

    3.ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或者长度,对数据类型调整或截断保存,报warning警告.

    4.TRADITIONAL模式:严格模式,当向MySQL数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误.用于事务时,会进行事务的回滚.

    3.STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • Django中更改默认数据库为mysql的方法示例
    • mysql修改数据库默认路径无法启动问题的解决
    • MySQL安装后默认自带数据库的作用详解
    上一篇:Mysql事务隔离级别之读提交详解
    下一篇:MySQL 8.0.13设置日期为0000-00-00 00:00:00时出现的问题解决
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    详解Mysql数据库date, datetime类型设置0000-00-00默认值(default)报错问题 详解,Mysql,数据库,date,datetime,