MySQL错误提示:sql_mode=only_full_group_by完美解决方案

yizhihongxing

MySQL错误提示:sql_mode=only_full_group_by 是在 MySQL 5.7 版本中引入的一个新特性。当开启该模式时,如果使用了GROUP BY语句但是SELECT语句中的列名没有在GROUP BY中出现,或者在SELECT语句中使用了聚合函数,但是列名并不在GROUP BY语句中,则会抛出“1055 error - 'XXXX' isn't in GROUP BY”的错误提示。这也导致了很多老版本MySQL数据库运行原有的SQL脚本时报错的问题。

下面介绍 “MySQL错误提示:sql_mode=only_full_group_by”的完美解决方案:

一、查看当前的sql_mode设置

首先,我们需要查看当前MySQL数据库的SQL_MODE设置。在MySQL客户端中输入以下命令:

SELECT @@SESSION.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

这就是当前MySQL数据库的SQL_MODE设置,其中包含了 “ONLY_FULL_GROUP_BY” 模式。

二、修改MySQL配置文件

在MySQL的配置文件中修改sql_mode即可解决该问题。

首先,编辑MySQL的配置文件my.cnf或my.ini(Windows中)。在Ubuntu服务器中可以使用以下命令查找my.cnf的位置:

sudo find / -name "my.cnf"

然后,找到配置文件中的 [mysqld] 模块下的sql_mode参数,并将其修改为:

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

保存修改后的配置并重启MySQL服务,操作完毕。

例如,在CentOS服务器中,MySQL的配置文件为 /etc/my.cnf,则编辑该文件:

sudo vi /etc/my.cnf

将如下的代码:

[mysqld]
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"

修改为:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

保存文件并重启MySQL服务:

sudo systemctl restart mysqld

三、示例说明

示例1:新项目开发问题

当开发一个新项目时,使用了groupby语句以及聚合函数,为了查询按照时间统计结果,我们先使用groupby按照时间分组但是并不需要对时间字段再做聚合操作,此时依据 sql_mode=only_full_group_by。会收到如下错误提示:

1055 error - 'Date' isn't in GROUP BY

解决方案如下:

  1. 通过执行 SELECT @@SESSION.sql_mode; 命令查看SQL模式。
  2. 在 MySQL 配置文件 my.cnfmy.ini 里(具体路径取决于你的环境和MySQL的安装位置)查找 sql_mode 的设置项,将这一项的值修改为 STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  3. 重启 MySQL 服务器,如 systemctl restart mysqld.service

示例2:老项目运行问题

有一个老项目的部分SQL语句不符合SQL Mode的要求,执行SQL语句会抛出 “1055 error - 'XXXX' isn't in GROUP BY”的错误提示,而且为了维护方便并不想修改SQL语句,可以采用更改MySQL配置文件的方法来解决问题。我们可以在MySQL配置文件中增加下面两行的 SQL_MODE,来适应老项目运行所需 SQL_MODE 的模式:

[mysqld]
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

"only_full_group_by" 加回 sql_mode 中;这样在 MySQL 安装服务之后就能自动设置 SQL_MODE 的值。这样,老项目的SQL语句就可以正常运行,而开发新项目时由于也将 only_full_group_by 加回来,就避免出现 sql_mode=only_full_group_by 的错误提示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL错误提示:sql_mode=only_full_group_by完美解决方案 - Python技术站

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

相关文章

  • mysql错误代码之1064的解决方案

    问题描述: 当使用MySQL的时候,有时会出现错误代码为1064的错误信息,该错误提示一般是由于执行SQL语句时出现了语法错误,导致MySQL无法正确解析语句而出现的。那么如何解决这个问题呢? 解决方案: 出现错误代码为1064时,需要按照以下步骤进行解决: 1.检查SQL语句是否存在语法错误。 2.检查表名、字段名是否拼写错误。 3.检查值是否存在空格或单…

    MySQL 2023年5月18日
    00
  • mysql常见问题解决第1/2页

    MySQL 常见问题的解决可以参考如下攻略: 问题排查步骤 1. 确认 MySQL 服务是否正常启动 运行以下命令确认 MySQL 服务是否正常启动: systemctl status mysqld 如果 MySQL 服务未启动,则运行以下命令启动 MySQL 服务: systemctl start mysqld 2. 检查 MySQL 登录是否成功 尝试使…

    MySQL 2023年5月18日
    00
  • MyEclipse连接MySQL数据库报错解决办法

    下面是MyEclipse连接MySQL数据库报错解决办法的完整攻略。 问题背景 MyEclipse可以使用Data Source Explorer来连接数据库,但在连接MySQL数据库时,可能会遇到以下报错: Cannot load driver: com.mysql.jdbc.Driver 这个问题通常是由于MyEclipse缺少MySQL驱动程序引起的。…

    MySQL 2023年5月18日
    00
  • MySQL中存储时间的最佳实践指南

    当我们在MySQL中存储时间数据时,需要遵循一些最佳实践来确保表现良好,并且保证数据的完整性。以下是一些建议和指南,有助于确保您在MySQL中存储时间数据的最佳实践。 使用DATETIME来存储时间 MySQL提供了多种数据类型来存储时间数据,如DATE、TIME、DATETIME、TIMESTAMP等。但对于大多数使用情况,最好的选择是使用 DATETIM…

    MySQL 2023年5月19日
    00
  • mysql Out of memory (Needed 16777224 bytes)的错误解决

    当使用MySQL时,有时会发生”Out of memory”错误。这种错误通常意味着MySQL要求的内存量超过了系统配置的限制。 在这种情况下,需要调整MySQL配置参数或增加系统内存。 以下是解决这种错误的完整攻略: 1. 确认错误来源 首先需要确认哪个应用程序导致了”Out of memory”错误。你可以检查MySQL日志文件(例如/var/log/m…

    MySQL 2023年5月18日
    00
  • MySQL修改存储过程(ALTER PROCEDURE)方法详解

    MySQL的ALTER PROCEDURE语句可以用于修改已经存在的存储过程。修改存储过程通常包括修改存储过程的名称、参数、注释、以及存储过程中的SQL语句等。 ALTER PROCEDURE的语法如下: ALTER PROCEDURE procedure_name [characteristic …] 其中procedure_name为要修改的存储过程…

    MySQL 2023年3月10日
    00
  • mysql 用户权限命令

                               网上搜索很多都不行:特此记录下自己亲测可以生效的命令                                                          本章持续维护 先介绍下环境: 阿里云linux版本:CentOS 7.4 64位 数据库版本:mysql  Ver 14.14 Distr…

    MySQL 2023年4月12日
    00
  • MySQL 是怎样运行的:从根儿上理解 MySQL:字符集和比较规则

    https://juejin.im/book/5bffcbc9f265da614b11b731 字符集和比较规则简介 一些重要的字符集 ASCII字符集 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码,我们看一些字符的编码方式: ‘L’ -> 01001100(十六进制:…

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