mysql5.7和mysql5.6默认的sql_mode说明

一.场景:

最近在部署新的项目,开发要求把原先旧项目的MySQL数据导入到新项目MySQL5.7的数据库上。(旧项目上运行的是mysql5.6)
不就是导入数据嘛,也没多想,那就导入呗。导入时,开始报错了,
报错如下:
MySQL 5.7 ERROR 1067 (42000): Invalid default value for ‘CREATE_TIME‘
MySQL 5.7 ERROR 1067 (42000): Invalid default value for ‘day‘
简单google了下,发现原来是mysql5.6和mysql5.7默认的sql_mode模式参数是不一样的,才导致的报错。
下面咱们就简单测试下,记录下问题的解决过程:

二.演示过程:

2.1建测试表
首先创建一个表,表中包含一个字段day,允许插入零日期 ‘0000-00-00‘ COMMENT ‘日期‘,

CREATE TABLE `zx_scores` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT ‘0‘,
  `integral` int(10) NOT NULL DEFAULT ‘0‘,
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT ‘0‘,
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`day` date NOT NULL DEFAULT ‘0000-00-00‘ COMMENT ‘日期‘,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

2.2登录数据库建表测试
登录mysql5.6服务,查看默认的sql_mode为:O_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
并且执行上面的建表语句,可以正常执行

于是又登录MySQL5.7服务查看默认的sql_mode为:

[email protected] [test01]> show  variables like ‘%sql_mode%‘;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
或者采用如下查看也是一样的 :
select @@sql_mode; ##当前mysql的session会话层查看
select @@global.sql_mode;##全局查看

于是执行上面的建表语句,执行报错了:

[email protected] [test01]>CREATE TABLE `zx_scores` (   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,   `titles` char(15) NOT NULL,   `icon` smallint(6) unsigned DEFAULT ‘0‘,   `integral` int(10) NOT 

NULL DEFAULT ‘0‘,   `isdefault` tinyint(1) unsigned NOT NULL DEFAULT ‘0‘, `create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `day` date NOT NULL DEFAULT ‘0000-00-00‘ COMMENT ‘日期‘,   

PRIMARY KEY (`id`),   KEY `integral` (`integral`) ) ENGINEE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
ERROR 1067 (42000): Invalid default value for ‘day‘

2.3报错原因说明:

MySQL的sql_mode有两种,一种是空值,一种是严格模式,会给出很多默认设置。在MySQL5.7之后默认使用严格模式。
NO_ZERO_DATE:若设置该值,MySQL数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
例如表中含字段TIMESTAMP列(如果未声明为NULL或显示DEFAULT子句)将自动分配DEFAULT ‘0000-00-00 00:00:00‘(零时间戳),也或者是本测试的表day列默认允许插入零日期 ‘0000-00-00‘ COMMENT ‘日期‘;这些显然是不满足sql_mode中的NO_ZERO_DATE而报错。

2.4解决方式:
解决方式
方式一:先执行select @@sql_mode,复制查询出来的值并将其中的NO_ZERO_IN_DATE,NO_ZERO_DATE删除,然后执行set sql_mode = ‘修改后的值‘。
此方法只在当前会话中生效
方式二:先执行select @@global.sql_mode,复制查询出来的值并将其中的NO_ZERO_IN_DATE,NO_ZERO_DATE删除,然后执行set global sql_mode = ‘修改后的值‘。
此方法在当前服务中生效,重新MySQL服务后失效

方法三:在mysql的安装目录下,或my.cnf文件,新增 sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,
添加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。
此方法永久生效.当然生产环境上是禁止重启MySQL服务的,所以采用方式二来解决线上的问题。
写此博文希望能够帮助更多的遇到此问题的小伙伴们

原文地址:http://blog.51cto.com/wujianwei/2315320

时间: 2024-10-12 15:17:59

mysql5.7和mysql5.6默认的sql_mode说明的相关文章

MySQL5.5 RPM安装的默认安装路径

MySQL5.5 RPM安装的默认安装路径 2011-06-20 10:34:32|  分类: MySQL|举报|字号 订阅 下载LOFTER客户端 由于一客户要求安装mysql- 5.5.11,apache-2.2.18,php-5.3.6,这些目前来说都是比较新版本.apache-2.2.18,php-5.3.6目前已经 是最新稳定版的.mysql -5系列的mysql编译安装使用cmake,和一往不同.有一报错,尚未解决,据说官方仍未回复.所以我用RPM包给客户安装了mysql- 5.5.

centos7和centos6.5环境rpm方式安装mysql5.7和mysql5.6详解

centos7和centos6.5环境rpm方式安装mysql5.7和mysql5.6详解 centos环境安装mysql5.7 其实不建议安装mysql5.7 语法和配置可能和以前的版本区别较大,多坑,慎入 1.yum方式安装(不推荐) a.安装mysql5.7 yum源 centos6: wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpmyum localinstall mysql-community-release

centos 下编译安装mysql5.1与mysql5.5

mysql5.1.60编译安装 1.tar -zxvf mysql* 2../configure 之前要make clean ./configure --prefix=/home/shk/mysql-5.1.60 \ --enable-local-infile \ --with-unix-socket-path=/home/shk/mysql-5.1.60/var/mysql.sock \ --with-tcp-port=5506 \ --enable-thread-safe-client \

centos同时运行mysql5.6和mysql5.7

centos同时运行mysql5.6和mysql5.7 一.准备 从mysql官网下载mysql5.6和mysql5.7 关闭防火墙,关闭selinux 创建mysql用户 ~]# useradd mysql 二.安装 先安装mysql5.6 1.解压,并改名 ~]# tar xf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz -C /opt ~]# cd /opt ~]# mv mysql-5.6.40-linux-glibc2.12-x86_64 my

Mysql学习之--卸载源码mysql-5.6安装mysql-5.5

Mysql学习之--卸载源码mysql-5.6安装mysql-5.5 系统环境: 操作系统:RedHat EL6 DB Soft:  Mysql 5.5.12     Mysql 在linux下的安装方式有两种版本,一种为Binary(二进制),另外一种为Source(源码包),本文为Source Install方式. 由于,本机已经安装了mysql-5.6的版本,前面的版本采用源码包安装,只需要删除相应的安装文件即可! 1.卸载mysql-5.6 删除/var/lib/mysql下的文件: [

MySQL5.0+提示字段没有默认值(doesn’t have a default value)的解决方法

方法一: 打开my.ini,查找 sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION” 修改为 sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION” 然后重启MYSQL . 方法二: MySQL 5 uses a strict mode which needs to be disabled. In Windows, Goto Start–>Progr

mysql5.7.11修改root默认密码

知道 MySQL 出了5.7了,并且网上说性能提高了一两倍,于是在虚拟机上安装了个 CentOS 7,在上面安装 MySQL 5.7 我使用的是 yum安装方式,要求虚拟机能够上网,因为它会在线下载安装包 使用 yum 安装很简单,在能够访问互联网的情况下,执行 yum list |grep mysql 找到可安装的 mysql 软件包,我要安装的是 5.7的客户端和服务端,基本上执行 yum install mysql-community-client yum install mysql-co

MySQL-5.7.7复制功能的默认设置改进

1. 默认开启简化的GTID 恢复 Binlog_gtid_simple_recovery=TURE(默认值)      这个参数控制了当mysql启动或重启时,mysql在搜寻GTIDs时是如何迭代使用binlog文件的. 这个选项设置为真,会提升mysql执行恢复的性能.因为这样mysql-server启动和binlog日志清理更快.该参数为真时,mysql-server只需打开最老的和最新的这2个binlog文件,gtid_purged参数的值和gtid_executed参数的值可以根据这

mysql5.7系列修改root默认密码

操作系统为centos7 64 1.修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2.重启 mysqld 服务:systemctl restart mysqld 3.使用 root 用户登录到 mysql:mysql -u root 4.切换到mysql数据库,更新 user 表: update user set authentication_string = password('r