共计 1755 个字符,预计需要花费 5 分钟才能阅读完成。
一个项目的开发到测试上线运营,团队对项目的管理不成熟会影响项目的开发效率。由于项目是我刚接手,独自在 CentOS 搭建 PHP 环境,所以就考虑使用高版本,选择了 MySQL5.7,本地开发环境还是 Windows 继承环境,PHP 环境和 CentOS 是统一的 7.0,但是 MySQL 版本是 5.3 的,本地开发一切顺利,到了 CentOS 下出现了一些问题,这就是因为开发环境和测试 | 线上环境不一致导致的。
mysql 命令 gruop by 报错 this is incompatible with sql_mode=only_full_group_by
看一下 ONLY_FULL_GROUP_BY 的意思是:对于 GROUP BY 聚合操作,如果在 SELECT 中的列,没有在 GROUP BY 中出现,那么这个 SQL 是不合法的,因为列不在 GROUP BY 从句中,也就是说查出来的列必须在 group by 后面出现否则就会报错,或者这个字段出现在聚合函数里面。
接下来直接说一下解决问题的过程。
先进入 MySQL 客户端执行命令
select @@GLOBAL.sql_mode;
+--------------------------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.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;
网上给出的解决方法有大概三种,一种是在程序代码的语句里,给查询条件的列增加聚合函数,如果你这样做,那么就很麻烦了,而且以在开发过程中使用 group by 的语句都要下功夫,这个方法就算了。
推荐直接关掉这个配置项。
那么怎么把这一项关掉呢,直接在客户端执行命令关掉不就可以了么,set @@global.sql_mode = ……., 执行成功,然后执行命令查看一下,果然第一项不在了,然后我们再重启一下 mysql 服务,再次查询,还在.. 哈哈。。
那么,接下来放绝招了,还是从 Mysql 的配置文件下手吧。
找到 my.cnf,编辑它~ 把以下命令放到合适位置,重启 mysql 服务,OK~ 报错没啦~
[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
千万要注意的是,网上很多方案都差不多,但是就是成功不了,原因是网上很多帖子给出的方案都是前面多了一个 set,按照上面的方法就可以了~
#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 // 前面多了个 set 是不对滴~
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-10/147872.htm