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日

相关文章

  • 解决MySQL5.1安装时出现Cannot create windows service for mysql.error:0

    当在Windows操作系统中安装MySQL 5.1时,有时会遇到“Cannot create windows service for mysql. error:0”的错误。这个错误通常是由于该计算机上已经存在mysql服务并且正在运行,或者是由于没有足够的权限来安装和创建服务引起的。为了解决这个问题,您可以尝试以下几个步骤: 步骤一:停止和删除现有的MySQ…

    MySQL 2023年5月18日
    00
  • 全面分析MySQL ERROR 1045出现的原因及解决

    全面分析MySQL ERROR 1045出现的原因及解决 什么是MySQL ERROR 1045? MySQL ERROR 1045是指在尝试连接到MySQL数据库时出现的权限验证错误。通常,此错误会提示“access denied for user ‘user_name’@’localhost’ (using password: YES)”或类似的消息。 …

    MySQL 2023年5月18日
    00
  • mysql分页原理和高效率的mysql分页查询语句

    下面我将详细讲解“mysql分页原理和高效率的mysql分页查询语句”的完整攻略。 分页原理 分页是我们在开发Web应用时经常使用的功能,其主要作用是将一大批数据分割成多个小块以便显示在前端。数据库中的分页也是同样的原理,即将一张表中的数据进行分块显示。 在MySQL中,分页最常用的是基于LIMIT关键字实现的分页机制。LIMIT语句可以通过两个参数来进行数…

    MySQL 2023年5月19日
    00
  • mysql报错:MySQL server version for the right syntax to use near type=InnoDB的解决方法

    当我们在创建MySQL数据库表时,有时候可能会遇到以下报错: mysql报错: MySQL server version for the right syntax to use near ‘type=InnoDB’ 的解决方法 这个错误的原因是我们在创建表时使用了过时的”TYPE”关键字,而MySQL 5.5版本以后已经不支持“type”关键字了,而应该使用…

    MySQL 2023年5月18日
    00
  • MySQL Threads_running飙升与慢查询的相关问题解决

    MySQL Threads_running飙升与慢查询的相关问题解决 问题描述 在使用MySQL数据库时,我们可能会遇到Threads_running飙升的情况,同时也可能会出现慢查询的问题。这些问题可能会导致服务器性能下降,影响用户使用体验。下面是一些可能导致这些问题的原因: 大量的并发请求导致了Threads_running飙升 未优化的SQL查询导致了…

    MySQL 2023年5月19日
    00
  • MySQL游标(Cursor)的定义及使用方法详解

    MySQL游标(Cursor)是一种可在数据库中使用的数据结构,它被用于遍历结果集中的所有行并进行特定操作。游标通常用于存储过程和函数中,当需要一行一行地获取结果集中的数据时,它就变得非常有用了。 游标通常与SELECT语句一起使用,以便在结果集中获取数据。游标用于遍历结果集中的记录,并将结果集中的数据一行一行地存储或处理。游标顺序访问结果集中的每一行,并将…

    MySQL 2023年3月10日
    00
  • 阿里巴巴 MySQL 数据库之建表规约(一)

    建表规约 强制部分 【强制】 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint (1 表示是,0 表示否)。说明:任何字段如果为非负数,必须是 unsigned。正例:表达逻辑的字段名 is_deleted,1 表示删除,0 表示未删除。 【强制】 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁…

    MySQL 2023年4月13日
    00
  • MySQL 5.6主从报错的实战记录

    下面就详细讲解“MySQL 5.6主从报错的实战记录”的完整攻略。 问题描述 在 MySQL 5.6 主从复制环境中,从库报错如下: Error ‘Duplicate entry ‘12345’ for key ‘PRIMARY” on query… 问题分析 这个错误提示的含义是,由于从库上已经存在一条与主库上相同的记录,从而导致主从同步失败。查看数…

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