Mac MySQL5.7 默认打开 ONLY_FULL_GROUP_BY 模式问题与解决方案
背景
MySQL5.7 后将 sql_mode 的 ONLY_FULL_GROUP_BY 模式默认设置为打开状态,这样一来,很多之前的 sql 语句可能会出现错误,错误信息如下:
Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column '×××' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
描述:select 的列都要在 group 中。
解决方案一
这时我们可以通过 Navicat 或进入 MySQL 命令行终端输入 select @@global.sql_mode 来查看当前数据库的 sql_mode 属性值

复制查询结果,去掉 ONLY_FULL_GROUP_BY,重新赋值,执行成功后,就可以将ONLY_FULL_GROUP_BY 模式默认设置为关闭状态,解决之前的 sql 报错问题
set sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
但是这种方式设置的只是当前会话中的sql_model,服务器重启后,设置可能会失效。
解决方案二
通过在 my.cnf 配置文件中写入 sql_mode 实现关闭 ONLY_FULL_GROUP_BY 永久生效
首先要找到 my.cnf
但是官网说:从 5.7.18 开始不在二进制包中提供 my-default.cnf 文件。参考: MySQL 官网
这个 my.cnf 文件可以是自定义位置,也可以使用如下默认的位置,只要放在默认位置,MySQL 自动识别(通过 deb 或者 APT 源安装的,初始位置在下方列表):
| FileName | Purpose |
|---|---|
| /etc/my.cnf | 全局选项 |
| /etc/mysql/my.cnf | 全局选项 |
| SYSCONFDIR/my.cnf | 全局选项 |
| $MYSQL_HOME/my.cnf | 服务器特定选项(仅限服务器) |
| defaults-extra-file | 指定的文件 –defaults-extra-file,如果有的话 |
| ~/.my.cnf | 用户特定选项 |
| ~/.mylogin.cnf | 用户特定的登录路径选项(仅限客户端) |
以上的详细说明可以参考官网解释:MySQL 官网
我选择创建在 /etc/mysql/my.cnf 位置
配置文件中我增加了一个 mysqld-5.7 组,并配置 sql_mode
配置文件语法也可参考 MySQL 官网
配置文件内容如下:
[mysqld-5.7] 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 服务器,在次执行 select @@global.sql_mode 就会发现 ONLY_FULL_GROUP_BY 没有了。
结尾
参考链接:
(34条消息) MySQL的my.cnf文件(解决5.7.18下没有my-default.cnf)_djCode-CSDN博客
(34条消息) MySQL5.7默认打开ONLY_FULL_GROUP_BY模式问题与解决方案_Peacock__的博客-CSDN博客_mysql5.7 only_full_group_by
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu