SQL_MODE 不支持 MySQL 5.7.18

SQL_MODE not working on MySQL 5.7.18

我的 PHP 应用程序出现以下错误:

Incorrect SQL query (Database) In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'db_20172201.cm_order.buyer'; this is incompatible with sql_mode=only_full_group_by

环顾四周并尝试找出导致此错误的查询后,我决定更改 MySQL 服务器中的 SQL_MODE 选项。

我做了两件事来完成这个:

我认为这些就足够了,但错误永远不会从我的应用程序中消失。 当我通过此查询

在我的环境中检查 SQL_MODE 的值时
SELECT @@GLOBAL.sql_mode

它显示上面插入的值。

我不知道还能去哪里找。我还尝试在执行查询之前从我的应用程序设置 sql_mode 变量,但没有解决。

--- 更新

我刚刚在我的应用程序中打印了查询的结果 SELECT @@SESSION.SQL_MODE 结果是我设置的结果:

array(1) { [0]=> object(stdClass)#5 (1) 
    { 
        ["@@SESSION.sql_mode"] => string(118) "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    }
}

但我仍然得到错误

PS。 MySQL 版本为 5.7.18

存储程序——过程、函数、触发器和事件——有一些许多用户从未注意到的特殊机制,因为它们通常 "just work."

创建存储程序时,会捕获环境的某些方面并将其与代码一起存储,并在每次调用程序时使用。

SHOW CREATE PROCEDURE ... 显示这些值。

其中之一是@@SQL_MODE

这允许过程的定义者确保过程运行时的环境始终具有这些属性。

那么,官方的答案是删除并重新创建具有正确环境的过程。

但是...这里的属性其实是存放在mysql.proctable中的。所以你在这里有潜力"quick fix",只要你牢记以下几点:

The server manipulates the mysql.proc table in response to statements that create, alter, or drop stored routines. It is not supported that the server will notice manual manipulation of this table.

https://dev.mysql.com/doc/refman/5.7/en/stored-routines-privileges.html

如果这个系统不是关键的并且你有备份,你可以仔细操作mysql.proctable行来改变sql_mode,然后重启MySQL服务器以便考虑对 table 的更改。

请注意,另一个看似可行的选项 -- 使用 mysqldump 制作转储文件并重新加载它 -- 将无效,因为 mysqldump 向转储文件添加语句以确保过程将使用创建转储文件时过程中存在的相同设置进行恢复——因此对全局服务器配置的更改将无效。

您当然可以修改转储文件来更改这些值,但这是一个有点高级的操作。

如果您从包含 SQL 语句但未明确设置 sql_mode 的文件中加载此架构,则重新加载文件也应该会产生预期的效果。

最后,请注意 ONLY_FULL_GROUP_BY 试图保护您免受以不符合该功能目的的方式使用 MySQL 分组扩展的查询。从 5.7.x 开始,被 ONLY_FULL_GROUP_BY 拒绝的查询实际上可能会产生不确定的结果,或者可能会利用副作用或偶然或巧合的正确结果——而不是设计 - 这种行为可能会在未来的版本中消失(例如,由于查询优化器的变化),因此不应依赖。

最好的解决办法是使查询在理论上是正确的。