【问题标题】:Disable ONLY_FULL_GROUP_BY禁用 ONLY_FULL_GROUP_BY
【发布时间】:2014-07-18 05:41:45
【问题描述】:

我不小心启用了这样的 ONLY_FULL_GROUP_BY 模式:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

如何禁用它?

【问题讨论】:

  • 你试过SET sql_mode = ''吗?
  • 您为什么要禁用一种使 MySQL 更好地符合 SQL 标准的模式,以及一种教您在编写查询时更加小心的模式?
  • 从 Mysql 5.7 开始,您也可以使用 ANY_VALUE(column) 函数来改进您的查询。见文档here
  • @AndriyM 我需要尽快使用它,因为我正在将一整套旧应用程序移植到新服务器上,无论我是否有源代码,它们都需要工作。
  • @AndriyM 因为如果我按唯一索引列分组,那么我已经知道每一行都是唯一的 - 通过命令为每个添加一个单独的组。单身的。柱子。在桌子上是一种皇家的痛苦。

标签: mysql


【解决方案1】:

解决方案 1: 从 mysql 控制台中删除 ONLY_FULL_GROUP_BY

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

你可以阅读更多here

解决方案 2: 从 phpmyadmin 中删除 ONLY_FULL_GROUP_BY

  • 打开 phpmyadmin 并选择 localhost
  • 单击菜单变量并向下滚动以进入 sql 模式
  • 单击编辑按钮更改值并删除 ONLY_FULL_GROUP_BY 并单击保存。

【讨论】:

  • 此解决方案在 mySQL 5.7.11 上运行良好,应该是公认的解决方案。接受的答案不适用于新版本的 mySQL
  • 刚刚确定。没关系REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''),无论如何,MySQL 都会从记录中删除不需要的逗号。 OP的答案是正确的。
  • 这行得通,但是当我重新启动mysql服务器时,默认值被恢复了......为什么?有持久的解决方案吗?谢谢!
  • 回答我的问题(持久解决方案):您必须将 sql_mode 的描述放入 my.cnf 文件(例如 /etc/my.cnf)并重新启动服务器。例如,插入(在 [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"
  • GLOBAL 对我不起作用,但 SESSION 对我有用。SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
【解决方案2】:

更新:

为了保持您当前的 mysql 设置并禁用 ONLY_FULL_GROUP_BY,我建议访问您的 phpmyadmin 或您正在使用的任何客户端并输入:

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me

下一个复制结果到您的my.ini 文件。

薄荷sudo nano /etc/mysql/my.cnf

ubuntu 16 及更高版本sudo nano /etc/mysql/my.cnf

ubuntu 14-16/etc/mysql/mysql.conf.d/mysqld.cnf

小心! copy_me 结果可以包含很长的文本,默认情况下可能会被修剪。确保复制整个文本!


旧答案:

如果您想永久禁用错误“SELECT 列表的表达式 #N 不在 GROUP BY 子句中,并且包含在功能上不依赖于的非聚合列 'db.table.COL' GROUP BY 子句中的列;这与 sql_mode=only_full_group_by 不兼容”执行这些步骤:

  1. sudo nano /etc/mysql/my.cnf
  2. 将此添加到文件末尾

    [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"
    
  3. sudo service mysql restart重启MySQL

这将为所有用户禁用ONLY_FULL_GROUP_BY

【讨论】:

  • 对我来说,在同一行设置 mysqld 标签不起作用,但确实可以使用换行符 :) 谢谢
  • 对于 ubuntu,自定义配置值所在的文件是 /etc/mysql/mysql.conf.d/mysqld.cnf
  • 这适用于 Ubuntu 16.04(14 到 16 升级问题..)。 /etc/mysql/my.cnf 是正确的文件。 knb 提到的文件包含在这个 my.cnf 文件中,至少在 16.04 中(配置现在分成多个文件)。
  • 使用“SELECT @@sql_mode;”在进行更改之前查看当前处于哪些模式。
  • 对我来说在 mysql 8.0.22 上(在 Digital Ocean /etc/mysql/mysql.conf.d/mysqld.cnf 上)这需要删除一个“NO_AUTO_CREATE_USER”才能工作,否则 mysql 将无法启动 STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
【解决方案3】:

小心使用

SET sql_mode = '' 

这实际上清除了当前启用的所有模式。如果您不想弄乱其他设置,您可以做一个

SELECT @@sql_mode 

首先,获取启用模式的逗号分隔列表,然后将其设置到此列表中,不使用ONLY_FULL_GROUP_BY 选项。

【讨论】:

  • 最好的方法是:then SET it to this list without the ONLY_FULL_GROUP_BY option.?
  • @KevinMeredith 我对docs 的阅读是没有办法一次打开/关闭一种模式——所有的例子都要求你提供一个逗号分隔的你想要的列表——例如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';
  • 如果这是永久性更改,请使用如下行编辑 my.cnf:sql_mode=<comma-separated-list>,然后停止并启动您的服务器。按照您的操作系统的文档了解 my.cnf 的位置和最佳编辑方式。
【解决方案4】:
    mysql> set global 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> set session 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> exit;

【讨论】:

  • @RémiBreton:你的 mysql 版本是多少?
  • 这确实有效。但是在我重新启动系统(ubuntu 16.04)后,sql_mode 回滚到以前的值。我现在能做什么?
  • 太棒了,为我工作,只是我需要永久转换它
【解决方案5】:

试试这个:

SET sql_mode = ''

社区注释:正如下面的答案所指出的,这实际上清除了当前启用的所有 SQL 模式。这不一定是你想要的。

【讨论】:

  • 哇,'' = 'full group by is disabled'? MySQL 做了一些非常愚蠢的事情,但那是在上面。
  • 我认为这基本上禁用了任何sql模式;
  • 这对我不起作用。我看到0 rows affected,但我的查询仍然不起作用:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
  • 在尝试此答案之前,请务必查看Machavity's warning,如果您希望更改保持不变,请确保use global in the command
  • 每次回到MySql时,总会遇到这个让我很烦恼的问题,因为我总是忘记问题出在哪里:) 当你认为它的时候,感觉只是令人失望正在工作,但现在不是因为版本更改。
【解决方案6】:

只向 sql_mode 添加一种模式而不删除现有模式:

SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));

仅从 sql_mode 中删除特定模式而不删除其他模式:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));

在您的情况下,如果您只想删除 ONLY_FULL_GROUP_BY 模式,请使用以下命令:

SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

参考:http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html

【讨论】:

  • 这是一个很好的答案!谢谢。
  • 这是全局的还是当前连接上的?很好的答案!
【解决方案7】:

感谢@cwhisperer。 我在 Symfony 应用程序中遇到了与 Doctrine 相同的问题。我刚刚将选项添加到我的 config.yml:

doctrine:
    dbal:
        driver:   pdo_mysql
        options:
            # PDO::MYSQL_ATTR_INIT_COMMAND
            1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

这对我来说很好。

【讨论】:

  • 如果需要与 SET NAMES 'utf8' 结合使用以下“SET NAMES 'utf8', sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));”。如果使用两个查询,例如“SET NAMES 'utf8'; SET sql_mod...”,它将抛出“一般错误:2014 无法执行查询,而其他无缓冲查询处于活动状态。”
  • @VentzyKunev 请不要遵循这个建议,也不要使用这种方法设置SET NAMES,在大多数情况下,不需要 symfony 已经通过教义.dbal.charset cofnig 设置它:symfony.com/doc/current/reference/configuration/doctrine.html,并通过 PDO dns 正确执行,SET NAMES 是过时的方式,不应该用于 PHP 版本大于 5.3
【解决方案8】:

我注意到@Eyo Okon Eyo 解决方案只要不重新启动 MySQL 服务器就可以工作,然后恢复默认设置。这是一个对我有用的永久解决方案:

要删除特定的 SQL 模式(在本例中为 ONLY_FULL_GROUP_BY),请找到当前的 SQL 模式:

SELECT @@GLOBAL.sql_mode;

复制结果并从中删除不需要的内容 (ONLY_FULL_GROUP_BY)

例如:

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

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

创建并打开这个文件:

/etc/mysql/conf.d/disable_strict_mode.cnf

然后将新的 SQL 模式写入并粘贴进去:

[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 service mysql restart

或者你可以使用ANY_VALUE()来抑制ONLY_FULL_GROUP_BY值拒绝,你可以read more about it here

【讨论】:

  • 注册ANY_VALUE()
【解决方案9】:

开启:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16,适用于 Linux (x86_64),使用 EditLine 包装器

做:

$ sudo nano /etc/mysql/conf.d/mysql.cnf

复制粘贴:

[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

到文件底部

$ sudo service mysql restart

【讨论】:

  • mysql.cnf 是否永远不会被 mysql 更新覆盖?
  • @cwhisperer /etc/mysql/mysql.cnf 指向 2 个配置文件夹 !includedir /etc/mysql/conf.d/ + !includedir /etc/mysql/mysql.conf.d//etc/mysql/my.cnf 也是如此。因此,我假设配置文件在更新时不会被覆盖。你可以在这里阅读更多内容http://dev.mysql.com/doc/mysql/en/server-system-variables.html
  • 我试过这个,但它在 Ubuntu 18.04.2 仿生上不起作用。我遵循了这个并且它起作用了:sitepoint.com/… - 也许使用带有空格和引号的这种格式很重要:sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 也许创建一个新文件/etc/mysql/mysql.conf.d/mysqld_mode.cnf 很重要
【解决方案10】:

MySQL documentation 还指定了以下方法:

  • 在 my.cnf(Unix 操作系统)或 my.ini (Windows) 等选项文件中设置 sql-mode="&lt;modes&gt;"
  • 要在服务器启动时通过命令行设置 SQL 模式,请使用 --sql-mode="&lt;modes&gt;" 选项。

*其中&lt;modes&gt; 是用逗号分隔的不同模式的列表。

要显式清除 SQL 模式,请在命令行中使用 --sql-mode="" 或在选项文件中使用 sql-mode="" 将其设置为空字符串。

我将sql-mode="" 选项添加到/etc/my.cnf 并且它起作用了。

This SO solution 讨论了找出 MySQL 正在使用哪个 my.cnf 文件的方法。

修改后别忘了重启 MySQL。

【讨论】:

  • 这对我来说是正确的答案` Ver 14.14 Distrib 5.7.10, for osx10.11 (x86_64)`
  • 这应该被标记为正确答案。其他答案不能提供永久解决方案。
  • @br3nt 我如何检测当前使用的模式,以便在我不想取消所有模式的情况下删除不需要的模式?
  • 试试SELECT @@GLOBAL.sql_mode;
【解决方案11】:

sql_mode 添加或删除模式

MySQL 5.7.9 或更高版本

要在sql_mode 中添加或删除模式,您可以使用list_addlist_drop 函数。

要从当前 SESSION.sql_mode 中删除模式,您可以使用以下方法之一:

SET SESSION sql_mode = sys.list_drop(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY');
SET sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');

GLOBAL.sql_mode 中删除一个模式,该模式在当前运行时操作中持续存在,直到服务重新启动

SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');

MySQL 5.7.8 或更低版本

由于sql_mode 值是一个CSV 模式字符串,您需要确保该字符串不包含残留逗号,这可以通过使用TRIM(BOTH ',' FROM ...) 来完成。

要从 sql_mode 变量中删除模式,您需要使用 REPLACE()TRIM() 以确保删除所有残留的逗号。

SET SESSION sql_mode = TRIM(BOTH ',' FROM REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', ''));

要向sql_mode 变量添加模式,您可能需要使用CONCAT_WS(',', ...),以确保在当前模式后附加一个逗号,并使用TRIM() 以确保删除任何残留的逗号。

SET SESSION sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@SESSION.sql_mode));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@GLOBAL.sql_mode));

注意:更改 GLOBAL 变量不会传播到 SESSION 变量,直到建立新连接。

GLOBAL 变量将持续存在,直到正在运行的服务重新启动。

SESSION 变量将持续存在于当前连接,直到连接关闭并建立新连接。


恢复为GLOBAL.sql_mode

由于SET sql_mode = 'ONLY_FULL_GROUP_BY'; 是在没有GLOBAL 修饰符的情况下执行的,因此更改仅影响当前SESSION 状态值,这也与@@sql_mode 有关。要删除它并恢复到全局服务器重启时的默认值,您需要使用来自 @@GLOBAL.sql_mode 的值。 [sic]

当前SESSION 值仅对当前连接有效。 重新连接到服务器会将值恢复为GLOBAL 价值。

要将当前会话状态值恢复为当前全局值,您可以使用以下方法之一:

SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;

SESSION.sql_mode 值更改为ONLY_FULL_GROUP_BY

SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+--------------------+----------------------------------------------+
| @@sql_mode         | @@GLOBAL.sql_mode                            |
+--------------------+----------------------------------------------+
| ONLY_FULL_GROUP_BY | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+--------------------+----------------------------------------------+

SESSION.sql_mode 值还原为GLOBAL.sql_mode

SET sql_mode = @@GLOBAL.sql_mode;
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+----------------------------------------------+----------------------------------------------+
| @@sql_mode                                   | @@GLOBAL.sql_mode                            |
+----------------------------------------------+----------------------------------------------+
| NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------+----------------------------------------------+

服务器重启持久sql_mode使用选项文件

设置SQL mode 在服务器启动时,使用命令上的--sql-mode="modes" 选项 行,或 sql-mode="modes" 在选项文件中,例如 my.cnf(Unix 操作系统)或 my.ini (Windows)。 [sic]

请查看您的 MySQL 版本以确定支持和默认的modes

MySQL >= 5.7.5,

[mysqld]
    
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

请参阅Option File Syntax 了解更多信息。

在选项文件中指定选项的语法类似于 命令行语法。但是,在选项文件中,您省略了前导 选项名称中的两个破折号,并且您只指定一个选项 线。例如,--quick--host=localhost 在命令行上 应指定为 quickhost=localhost 在单独的行 一个选项文件。在中指定--loose-opt_name 形式的选项 一个选项文件,写成loose-opt_name

可以选择将值括在单引号或 双引号,如果值包含#,这很有用 评论字符。

默认sql_mode

由于 MySQL 文档每个版本的值已被删除,因此我将它们添加到此处供您参考。

MySQL >= 8.0.11 8.0.5 - 8.0.10 Skipped

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION

MySQL >= 5.7.8,

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 5.7.7

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL >= 5.7.5,

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION

MySQL >= 5.6.6,

NO_ENGINE_SUBSTITUTION

MySQL

''

【讨论】:

  • 至少对于 MySQL 8,my.cnf 中的设置需要两处更改:变量名有下划线,设置列表用逗号分隔。例如:[mysqld] sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
  • 如答案中所述,列出的 sql_mode 值已复制,如 MySQL 网站上显示的那样,可以通过单击 [sic] 链接查看。在option file (my.cnf) 中设置sql_mode 时,手册指出您应该删除命令行变量--sql-mode= 的前两个破折号,以支持使用sql-mode=dev.mysql.com/doc/refman/8.0/en/…,但是当前任何一种语法都有效。最后,包装 sql_mode 值不需要引号。
【解决方案12】:

如果您使用的是 WAMP。 左键单击 WAMP 图标,然后转到 MySQL -> MySQL 设置 -> sql-mode 然后选择sql-mode->用户模式

【讨论】:

  • 我的 WAMP 安装中没有 MySQL 设置是否有原因?有服务管理和 MySQL 控制台但没有设置?
  • 这正是我想要的!感谢您提供简单的 WAMP 服务器解决方案!我在本教程中尝试 #aggregation 时需要这个:youtu.be/HXV3zeQKqGY?t=9718
【解决方案13】:

在 MySQL 5.7 和 Ubuntu 16.04 上,编辑文件 mysql.cnf。

$ sudo nano /etc/mysql/conf.d/mysql.cnf

像下面这样包含 sql_mode 并保存文件。

[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

请注意,就我而言,我删除了模式 STRICT_TRANS_TABLES 和 ONLY_FULL_GROUP_BY。

这样做,它将永久保存模式配置。如果您只是通过 MySQL 更新 @@sql_mode 则不同,因为它将在机器/服务重新启动时重置。

之后,将修改后的配置生效,重启mysql服务:

$ sudo service mysql restart

尝试访问mysql:

$ mysql -u user_name -p

如果您能够登录并访问 MySQL 控制台,就可以了。太好了!

但是,如果你和我一样,遇到错误“unknown variable sql_mode”,这表明sql_modemysqld,您将不得不返回,再次编辑文件 mysql.cnf 并将[mysql] 更改为[mysqld]。重新启动 MySQL 服务并尝试登录 MySQL 控制台进行最后一次测试。在这里!

【讨论】:

  • 我强烈推荐上述方法,而不是在会话中设置它,感谢@alexandre-ribeiro。对于 Ubuntu 16.04 和 mysql 5.7.x 的用户,最好编辑文件并在 [mysqld] 下输入 sql_mode= 指令i> 组,因为根据我的经验,声明反对 [mysql] 不起作用。
  • 我有 MySQL 5.7.22。这很奇怪,但我必须从 my.cnf 中的 sql_mode 声明中删除 both STRICT_TRANS_TABLES 和 ONLY_FULL_GROUP_BY,如上所示,这样才能正常工作。实际上,我只想删除 ONLY_FULL_GROUP_BY 模式。如果我执行“设置全局/会话 sql_mode = ...”,我可以只删除 ONLY_FULL_GROUP_BY 而无需删除 STRICT_TRANS_TABLES 以使其工作。但由于这在重启后无法生存,所以对我来说并没有多大用处。
【解决方案14】:

这是我在 Mysql 工作台上修复的内容:

在我使用以下命令获取当前值之前

SELECT @@sql_mode 

后来我从列表中删除了 ONLY_FULL_GROUP_BY 键并粘贴了以下命令

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_mode 不会影响存储过程。所以你需要再次drop并执行SP才能生效
【解决方案15】:

在我的 sql(在 Mac OS X 上运行的版本 5.7.11)上,这适用于我在 mysql shell 客户端上:

SET
@@GLOBAL.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 5.6 文档,sql_mode 是默认的

MySQL 5.6.5 及后面版本中的空白字符串 NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 在 5.6.6 +

mysql 5.6 reference

【讨论】:

  • 其他答案声称sql_mode := '' 是可能的。你为什么不同意?
  • 你的字符串中的所有这些选项来自哪里?这背后的原因是什么?
  • 根据 MySQL 5.6 文档,sql_mode 在 MySQL 5.6.5 中默认为空字符串,在 5.6.6 中返回 NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES dev.mysql.com/doc/refman/5.6/en/…
  • 感谢在 Ubuntu 16.04 - mysql Ver 14.14 Distrib 5.7.18 上为我工作,对于 Linux (x86_64) 使用 EditLine 包装器
【解决方案16】:

对于 Mac OS Mojave (10.14) 打开终端

$ sudo mkdir /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ cd /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ sudo nano my.cnf

粘贴以下内容:

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

保存和退出 nano 的快捷键:Ctrl+xyEnter

注意:您可能需要在这些命令中更新mysql-5.7.24-macos10.14-x86_64,只需检查您在/usr/local/ 中获得的正确文件夹名称

希望对某人有所帮助!

【讨论】:

    【解决方案17】:

    在以下查询的帮助下禁用 ONLY_FULL_GROUP_BY。

    SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
    

    要启用 ONLY_FULL_GROUP_BY,请使用以下查询。

    SET sql_mode = 'ONLY_FULL_GROUP_BY';
    

    【讨论】:

      【解决方案18】:

      如果您使用的是 MySQL 8.0.11,则需要从 sql-mode 中删除“NO_AUTO_CREATE_USER”。

      在文件 /etc/mysql/my.cnf 和 [mysqld] 标头中添加以下行

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

      【讨论】:

        【解决方案19】:

        我正在使用学说,并在我的学说中添加了 driverOptions :

        return array(
        'doctrine' => array(
            'connection' => array(
                'orm_default' => array(
                    'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
                    'params' => array(
                        'host' => 'localhost',
                        'port' => '3306',
                        'user' => 'myusr',
                        'password' => 'mypwd',
                        'dbname' => 'mydb',
                        'driverOptions' => array(
                            PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
                        ),
                    ),
                ),
            ),
        ));
        

        在 phpmyadmin 中,用户需要在权限中激活 SUPER。

        【讨论】:

        • 使用 yaml 表示法来配置 Doctrine(如 Symfony 中所做的那样),您需要使用“1002”而不是常量“PDO::MYSQL_ATTR_INIT_COMMAND”,但这是我一直在寻找的几周前,无法找到。感谢您的解决方案!为我工作。
        【解决方案20】:
        1. 检查sql_mode的默认值:

          选择@@sql_mode;

        2. 通过执行以下查询从控制台中删除 ONLY_FULL_GROUP_BY:

        SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

        1. 也将其从您的特定数据库中删除

        使用数据库名称;

        SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

        1. 重启你的网络应用服务器

        2. 访问导致此问题的页面。它现在可以工作了。

        1. 在您的 my.cnf 文件中添加以下内容

          sql_mode="传统"

        注意:如果您使用的是 mac,my.cnf 可能在此处可用 /usr/local/etc/my.cnf

        或者试试这个链接https://dev.mysql.com/doc/refman/8.0/en/option-files.html

        1. 重启 MySQL 服务器

          sudo /usr/local/bin/mysql.server 重启

          brew服务重启mysql

        【讨论】:

        • 将 sql_mode="TRADITIONAL" 添加到 my.cnf 是永久正确设置我的 MySQL 的原因
        • 谢谢。每个连接/全局示例!谢谢
        【解决方案21】:

        我正在使用 mysql 并以 root 用户注册,对我有用的解决方案如下:

        mysql > 设置会话 sql_mode=(SELECT 替换(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

        【讨论】:

          【解决方案22】:

          添加行

          sql-mode=""
          

          my.ini 文件中作为永久修复。

          【讨论】:

            【解决方案23】:

            对于使用 cPanel/WHM 运行 VPS/服务器的用户,您可以执行以下操作以永久禁用 ONLY_FULL_GROUP_BY

            您需要 root 访问权限(在 VPS 或专用服务器上)

            1. 以 root 身份输入 WHM 并运行 phpMyAdmin

            2. 点击变量,查找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
            
            1. 通过 SFTP - SSH (root) 连接到您的服务器并下载文件/etc/my.cnf

            2. 在本地 PC 上使用文本编辑器打开 my.cnf 文件并将您在步骤 (2) 中复制的整行粘贴到其中(在 [mysqld] 部分下),但删除 ONLY_FULL_GROUP_BY,

            例如粘贴这个:

            # disabling ONLY_FULL_GROUP_BY
            sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
            
            1. 保存my.cnf文件并将其上传回/etc/

            2. 输入WHM,进入“WHM > 重启服务 > SQL Server (MySQL)”并重启服务

            【讨论】:

              【解决方案24】:

              这对我有用:

              SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
              

              【讨论】:

                【解决方案25】:

                从 MySQL 5.7.x 开始,默认的 sql 模式包括 ONLY_FULL_GROUP_BY。 (5.7.5之前,MySQL不检测函数依赖,默认不开启ONLY_FULL_GROUP_BY)。

                ONLY_FULL_GROUP_BY:非确定性分组查询将被拒绝

                更多详情请查看sql_mode的文档

                您可以按照以下任一方法修改sql_mode

                方法一:

                检查sql_mode的默认值:

                SELECT @@sql_mode
                

                通过执行以下查询从控制台中删除ONLY_FULL_GROUP_BY

                SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
                

                方法二:

                访问 phpmyadmin 以编辑您的 sql_mode

                • 登录phpmyadmin并打开localhost
                • 变量顶部显示在菜单项顶部并搜索 sql 模式
                • 点击编辑按钮删除ONLY_FULL_GROUP_BY并保存

                【讨论】:

                  【解决方案26】:

                  这是 Ubuntu 14+ 上 MySql 5.7+ 的永久解决方案:

                  $ sudo bash -c "echo -e \"\nsql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"  >> /etc/mysql/mysql.conf.d/mysqld.cnf"
                  $ sudo service mysql restart
                  # Check if login attempt throws any errors
                  $ mysql -u[user] -p # replace [user] with your own user name
                  

                  如果您能够顺利登录 - 您现在应该已准备就绪。

                  【讨论】:

                    【解决方案27】:

                    对于 MySql 8,你可以试试这个。 (未在 5.7 上测试。希望它也可以在那里工作)

                    首先打开这个文件

                    sudo vi /etc/mysql/my.cnf 并将以下代码粘贴到上述文件的末尾

                    [mysqld]
                    sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
                    

                    然后通过运行sudo service mysql restart重新启动mysql

                    【讨论】:

                    • 在 5.7.31-0ubuntu0.18.04.1 上也运行良好,非常感谢
                    【解决方案28】:

                    如果任何使用 Drupal 8 的人在使用 mysql 8 时遇到这个问题,我会通过添加这段代码来覆盖默认配置来解决这个问题。

                    来源:https://www.drupal.org/project/drupal/issues/2856270

                    选项,以防万一:

                    'init_commands' => array(
                        'sql_mode' => "SET sql_mode =''"
                      )
                    

                    【讨论】:

                    • 将 sql_mode 留空不会有任何副作用吗?
                    • @AhmadKarimi 也许,所以对于那些担心这个的人来说,这里是他们可以设置的另一个选项。 'sql_mode' => "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 |'"
                    • 记得在此配置更改后清除缓存,drush cr
                    • 在早期,MySQL 在检测与GROUP BY 的函数依赖关系时遇到问题,因此他们只允许SELECT 子句中的任何列,而不管GROUP BY 中的内容是什么。然后他们开始解决这个问题并发明了 ONLY_FULL_GROUP_BY 模式。当他们最终做对时,他们将 ONLY_FULL_GROUP_BY 设为默认模式。那么,Drupal 的问题是否表明仍然存在 MySQL 的功能依赖检测失败或 Drupal 存在缺陷的边缘情况?
                    【解决方案29】:

                    您可以使用配置文件 my.cnf 禁用它:

                    $ mysql --verbose --help | grep my.cnf
                    

                    所以在 macOS 10.12 中,它位于 usr/local/etc/my.cnf。你可以在这里编辑sql_mode

                    # Default Homebrew MySQL server config
                    [mysqld]
                    # Only allow connections from localhost
                    bind-address = 127.0.0.1
                    sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
                    

                    【讨论】:

                      【解决方案30】:

                      这是我通过 phpmyadmin 仪表板更改 Mysql 配置的解决方案:

                      为了修复“这与 sql_mode=only_full_group_by 不兼容”: 打开 phpmyadmin 并转到主页并选择“变量”子菜单。向下滚动以找到 sql 模式。编辑sql模式,去掉'ONLY_FULL_GROUP_BY'保存。

                      【讨论】:

                        猜你喜欢
                        • 2018-05-17
                        • 2017-06-12
                        • 2020-08-22
                        • 1970-01-01
                        • 2021-02-25
                        • 2017-10-08
                        • 2019-02-04
                        • 2018-06-17
                        相关资源
                        最近更新 更多