MySQL5.7中的sql_mode默认值带来的坑及解决方法

MySQL5.7中的sql_mode默认值带来的坑及解决方法

在MySQL5.7版本中,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. 对旧版本的代码迁移会有影响,出现Illegal mix of collations(字符集不一致)等错误;
  2. 自动生成时间戳的值不再支持0000-00-00这种情况,而且对于无效或不合法的日期,MySQL将抛出错误而不再返回NULL

为了避免这些问题,在使用MySQL5.7之前,需要对sql_mode进行设置,或者在升级后适时调整sql_mode的值。

设置方法:

可以通过以下两种方法设置sql_mode的值:

  1. 修改MySQL配置文件:打开MySQL配置文件my.cnf,并在[mysqld]部分中加入sql_mode设置,例如:

[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

然后重启MySQL服务使其生效。

  1. 直接在MySQL命令行下执行SET sql_mode命令,例如:

SET sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

这种方法可以动态设置sql_mode的值,并不需要重启MySQL服务。

示例说明:

  1. 案例1:旧版代码迁移失败

假设存在一个表test,其中有两个字段idname,定义如下:

CREATE TABLE test(
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

然后执行以下语句:

SELECT name FROM test GROUP BY name;

在MySQL5.6版本中,上述语句没有问题,可以正常执行。但在MySQL5.7版本中,会遇到以下错误:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

出错原因是在默认sql_mode中包含了ONLY_FULL_GROUP_BY选项,导致在GROUP BY语句中必须将所有字段都列出,否则会抛出错误。在这种情况下,可以通过修改sql_mode来解决问题。

  1. 案例2:生成时间戳失败

在MySQL5.7中,如果要插入一个0000-00-00日期,或者一个非法日期,例如2017-02-31(2月只有28/29天),MySQL会抛出以下错误:

ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'c' at row 1

这是由于默认sql_mode中包含了NO_ZERO_IN_DATENO_ZERO_DATE选项,导致MySQL不再支持0000-00-00这种日期格式,而且对于无效或不合法的日期,仅返回错误而不是NULL

解决方法可以将这两个选项从sql_mode中删掉,例如:

SET sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

这样,在插入0000-00-00日期或非法日期时,MySQL会返回NULL而不再抛出错误。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL5.7中的sql_mode默认值带来的坑及解决方法 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • MySQL启动错误解决方法

    以下是“MySQL启动错误解决方法”的完整攻略。 MySQL启动错误解决方法 当我们在使用MySQL的时候,有时候会遇到MySQL启动失败的情况。本文将介绍如何在遇到MySQL启动错误时进行解决。 一、查看错误日志 在解决MySQL启动错误时,首先需要看一下MySQL的错误日志,找出错误的原因。MySQL的错误日志一般在MySQL的安装目录下,名称为erro…

    MySQL 2023年5月18日
    00
  • MySQL配置文件my.cnf优化详解(mysql5.5)

    MySQL配置文件my.cnf优化详解(mysql5.5) MySQL作为一款广泛应用的数据库管理系统,在数据处理能力、存储空间使用效率,甚至是高并发下的性能表现等方面,都需要经过一些优化手段。其中,修改MySQL配置文件my.cnf是我们提高MySQL性能的一种可行方式。 本文将详细讲解如何对MySQL的my.cnf进行优化,以提高MySQL的性能表现。 …

    MySQL 2023年5月19日
    00
  • Mysql错误1366 – Incorrect integer value解决方法

    关于“Mysql错误1366 – Incorrect integer value解决方法”的完整攻略,我将以下几个方面的内容进行详细讲解: 问题描述和原因分析 当我们在使用Mysql时,有时候会碰到“1366 – Incorrect integer value”的错误。这种错误通常发生在我们尝试将一个字符串类型的数据插入到一个整数类型的列中,或者将一个过长的…

    MySQL 2023年5月18日
    00
  • Linux中允许远程用户登录访问mysql的方法

    需要手动增加可以远程访问数据库的用户。 方法一、本地登入mysql,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,将”localhost”改为”%” #mysql -u root -prootmysql>use mysql;mysql>update user set host = ‘%’ where user = ‘r…

    MySQL 2023年4月13日
    00
  • 解读SQL语句中要不要加单引号的问题

    当编写SQL查询语句时,通常需要将某些值包含在查询条件中以获取所需的结果。在某些情况下,需要在SQL语句中使用引号将值括起来。在SQL查询语句中加不加单引号是有一定的规则和限制的,这里为您提供一份详细的攻略: 总体原则 在SQL语句中加单引号或不加单引号需要根据数据类型来判断。其中,字符型和日期型的值必须加单引号,数值型的值通常不加单引号。 字符型 以字符串…

    MySQL 2023年5月18日
    00
  • MySQL提示“too many connections“错误的解决过程

    当MySQL连接数超过其最大连接限制时,就会出现”too many connections”错误。这个问题可以通过以下几种方式来解决: 1. 修改MySQL的最大连接限制 在MySQL配置文件中(一般为my.cnf或my.ini)找到以下行: max_connections = 100 将100改成更大的值,即可增加最大连接数。不过,这种方法可能会导致系统负…

    MySQL 2023年5月18日
    00
  • 详解MySQL kill 指令的执行原理

    详解MySQL kill 指令的执行原理 MySQL kill指令可用于终止正在执行的MySQL进程,本文将详细讲解MySQL kill指令的执行原理。 MySQL kill指令的语法 KILL [CONNECTION | QUERY] thread_id; 其中,thread_id为MySQL进程的线程ID。 使用CONNECTION参数时将中断指定连接进…

    MySQL 2023年5月19日
    00
  • MySQL聚合查询方法怎么使用

    本篇内容介绍了“MySQL聚合查询方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1、前言 前面的内容已经把基础的增删改查介绍的差不多了,也介绍了表的相关约束, 从本期开始往后的内容,就更加复杂了,更多的是一些复杂的查询 SQL. 2、插入查询结果…

    MySQL 2023年4月10日
    00
合作推广
合作推广
分享本页
返回顶部