MySQL8 this is incompatible with sql_mode=only_full_group_by

1,459 阅读1分钟

报错信息

image.png

修改方式(全局)

  1. 找到mysql得my.cnf文件, 追加下方代码 (可以通过find / -name my.cnf找到文件路径) sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

    image.png

  2. 刷新缓存, 输入下方命令, 回车后输入root密码即可

    mysqladmin -u root -p flush-hosts

  3. 启动mysql, 我这里是通过systemctl来管理服务, systemctl start mysqld;

错误原因

mysql服务支持多个sql模式, 不同的模式支持不同的sql语法; mysql8版本默认配置的sql模式请参考连接的A3.7; (dev.mysql.com/doc/refman/…)

想必第一个sql模式一眼就看到 ONLY_FULL_GROUP_BY;

该模式大致意思为: select列不允许出现非聚合列;

SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid GROUP BY o.custid

结合上面的报错信息想必各位也明白了, 我们开发人员写的代码存在非聚合列导致这个报错;

这个时候我们只需要取消掉ONLY_FULL_GROUP_BY即可;

其他修改方式

  1. 启动MySQL服务时使用该选项 --sql-mode=“modes";
  2. 运行状态设置sql模式 SET GLOBAL sql_mode = 'modes' / SET SESSION sql_mode = 'modes'; 更详细信息请参考官方文档(dev.mysql.com/doc/refman/…)