禁用ONLY_FULL_GROUP_BY

Zvi*_*Bar 538 mysql mysql-workbench

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

SET sql_mode = 'ONLY_FULL_GROUP_BY';
Run Code Online (Sandbox Code Playgroud)

我该如何禁用它?

Eyo*_*Eyo 1026

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

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多

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

  • 打开phpmyadmin并选择localhost
  • 单击菜单变量并向下滚动以获取sql模式
  • 单击编辑按钮更改值并删除ONLY_FULL_GROUP_BY并单击保存. 在此输入图像描述

  • 回答我的问题(持久解决方案):你必须将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" (47认同)
  • 这有效,但是当我重新启动mysql服务器时,默认值会恢复...为什么?有持久的解决方案吗?谢谢! (35认同)
  • 这个解决方案在mySQL 5.7.11上运行正常,应该是可以接受的.接受的答案不适用于新版本的mySQL (11认同)
  • `GLOBAL`对我不起作用,但`SESSION`做了.SET SESSION sql_mode =(SELECT REPLACE(@@ sql_mode,'ONLY_FULL_GROUP_BY',''));` (10认同)
  • 重启后问题返回.这不是永久性的. (9认同)
  • 刚刚确定.无论`REPLACE(@@ sql_mode,'ONLY_FULL_GROUP_BY','')`,MySQL都会从记录中删除不需要的逗号.OP的答案是正确的. (3认同)
  • 我通过在my.inf中添加sql_mode =“ STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”来解决此问题。任何地方。即使重启,它也可以工作。 (2认同)
  • 拒绝访问; 您需要(至少一项)超级权限才能执行此操作。我在仅删除完整的组时遇到了此错误 (2认同)

bre*_*req 349

更新:

在此输入图像描述

要保持当前的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"
    
    Run Code Online (Sandbox Code Playgroud)
  3. sudo service mysql restart 重启MySQL

这将禁用ONLY_FULL_GROUP_BY所有用户

  • 对于ubuntu,自定义配置值所在的文件是`/ etc/mysql/mysql.conf.d/mysqld.cnf` (19认同)
  • 在 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``` (4认同)
  • 这适用于Ubuntu 16.04(14到16次升级困境......)./etc/mysql/my.cnf是正确的文件.knb提到的文件包含在这个my.cnf文件中,至少在16.04(配置现在被分成多个文件). (3认同)
  • 对我来说,在同一行上设置mysqld标签不起作用,但确实可以使用换行符:)谢谢 (2认同)
  • 使用"SELECT @@ sql_mode;" 在进行更改之前查看当前正在使用的模式. (2认同)

Tar*_*ran 198

小心使用

SET sql_mode = '' 
Run Code Online (Sandbox Code Playgroud)

这实际上清除了当前启用的所有模式.如果你不想搞乱其他设置,你会想做一个

SELECT @@sql_mode 
Run Code Online (Sandbox Code Playgroud)

首先,要获取启用模式的逗号分隔列表,然后将其设置为此列表而不使用该ONLY_FULL_GROUP_BY选项.

  • @KevinMeredith我对[docs](http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html)的阅读是无法一次打开/关闭一个模式 - 所有这些示例要求您提供以逗号分隔的列表 - 例如`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';` (3认同)
  • 如果这是永久性更改,请使用如下一行编辑 my.cnf:`sql_mode=<comma-separated-list>`,然后停止并启动您的服务器。按照您操作系统的文档了解 my.cnf 的位置和最佳编辑方式。 (2认同)

Tri*_*ics 107

尝试一下:

SET sql_mode = ''
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这基本上禁用任何sql模式; (36认同)
  • 哇,'''`=''完整的组被禁用'`?MySQL做了一些非常愚蠢的事情,但那个就在那里. (11认同)
  • 在尝试这个答案之前,请务必查看[Machavity的警告](http://stackoverflow.com/a/31058962/816458),如果您希望更改仍然存在,请确保[在命令中使用`global`](http ://stackoverflow.com/a/35018178/816458). (10认同)
  • 每次当我在一段时间后回到MySql时,我总是遇到这个让我烦恼的问题,因为我总是忘记问题是什么:)感觉只是令人失望,当你认为它有效时,现在却没有因为版本更改. (6认同)

Wei*_*uan 106

    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;
Run Code Online (Sandbox Code Playgroud)

  • "SET GLOBAL ......"真的为我做了这件事. (11认同)
  • 这确实有效.但是在我重新启动系统(ubuntu 16.04)之后,`sql_mode`回滚到之前的值.我现在能做什么? (6认同)

Jan*_*sha 64

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

SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));
Run Code Online (Sandbox Code Playgroud)

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

SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));
Run Code Online (Sandbox Code Playgroud)

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

SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Run Code Online (Sandbox Code Playgroud)

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

  • 这是全局的还是当前连接上的?很好的答案! (2认同)

Arv*_*vid 47

感谢@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',''))"
Run Code Online (Sandbox Code Playgroud)

这对我来说很好.

  • 如果需要与 SET NAMES 'utf8' 结合使用,请使用以下“SET NAMES 'utf8', sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));”。如果使用两个查询,如“SET NAMES 'utf8'; SET sql_mod...”,它将抛出“一般错误:2014 当其他无缓冲查询处于活动状态时无法执行查询”。 (2认同)

Jad*_*eye 34

上:

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

做:

$ sudo nano /etc/mysql/conf.d/mysql.cnf
Run Code Online (Sandbox Code Playgroud)

复制和粘贴:

[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
Run Code Online (Sandbox Code Playgroud)

到文件的底部

$ sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)


Waq*_*leh 31

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

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

SELECT @@GLOBAL.sql_mode;
Run Code Online (Sandbox Code Playgroud)

复制结果并从中删除不需要的内容(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
Run Code Online (Sandbox Code Playgroud)

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

创建并打开此文件:

/etc/mysql/conf.d/disable_strict_mode.cnf
Run Code Online (Sandbox Code Playgroud)

并编写并过去你的新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
Run Code Online (Sandbox Code Playgroud)

重启MySQL:

sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)

或者您可以使用ANY_VALUE()抑制ONLY_FULL_GROUP_BY值拒绝,您可以在此处阅读更多相关信息

  • 准备使用“ ANY_VALUE()” (2认同)

br3*_*3nt 24

MySQL文档还规定了以下几种方法:

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

*<modes>以逗号分隔的不同模式列表在哪里.

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

我添加了sql-mode=""选项/etc/my.cnf并且它有效.

这个SO解决方案讨论了找出MySQL使用哪个my.cnf文件的方法.

不要忘记在进行更改后重启MySQL.


Ank*_*dal 23

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
Run Code Online (Sandbox Code Playgroud)

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

 SET GLOBAL sql_mode=
  (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Run Code Online (Sandbox Code Playgroud)

方法二:

访问 phpmyadmin 编辑您的sql_mode

  • 登录 phpmyadmin 并打开 localhost
  • 位于菜单项顶部的变量并搜索sql 模式
  • 单击编辑按钮删除ONLY_FULL_GROUP_BY并保存 phpmyadmin 中的 sql 模式设置

重启MySQL服务器

 sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)

或者

注销phpmyadmin并重新登录。


小智 20

借助以下查询禁用 ONLY_FULL_GROUP_BY。

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)

并启用 ONLY_FULL_GROUP_BY 使用以下查询。

SET sql_mode = 'ONLY_FULL_GROUP_BY';
Run Code Online (Sandbox Code Playgroud)


小智 19

如果您正在使用WAMP.左键单击WAMP图标,然后转到MySQL - > MySQL设置 - > sql-mode,然后选择sql-mode-> user mode

查看此图片


fyr*_*rye 18

添加或删除模式 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');
Run Code Online (Sandbox Code Playgroud)

GLOBAL.sql_mode当前运行时操作中删除模式,直到服务重新启动

SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');
Run Code Online (Sandbox Code Playgroud)

MySQL 5.7.8 或更低版本

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

要从sql_mode变量中删除模式,您需要REPLACE()与 with 一起使用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', ''));
Run Code Online (Sandbox Code Playgroud)

要将模式添加到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));
Run Code Online (Sandbox Code Playgroud)

注:更改GLOBAL变量并没有传播到SESSION变量,直到一个新的连接建立。

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

SESSION变量将保留当前连接,直到连接关闭并建立新连接。


恢复 GLOBAL.sql_mode

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

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

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

SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;
Run Code Online (Sandbox Code Playgroud)

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 |
+--------------------+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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 |
+----------------------------------------------+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

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

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

MySQL >= 5.7.5, <= 5.7.6 默认

[mysqld]
    
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅选项文件语法

在选项文件中指定选项的语法类似于命令行语法。但是,在选项文件中,您可以省略选项名称中前导的两个破折号,并且每行仅指定一个选项。例如,在命令行上的--quick--host=localhost应该在选项文件中的单独行中指定为quickhost=localhost。要--loose-opt_name在选项文件中指定表单的选项,请将其写为loose-opt_name.

该值可以可选地括在单引号或双引号中,如果该值包含# 注释字符,这将很有用。

默认sql_mode

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

MySQL >= 8.0.11 8.0.5 - 8.0.10 跳过

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

MySQL >= 5.7.8,<= 8.0.4

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
Run Code Online (Sandbox Code Playgroud)

MySQL 5.7.7

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

MySQL >= 5.7.5,<= 5.7.6

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

MySQL >= 5.6.6,<= 5.7.4

NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

MySQL <= 5.6.5

''
Run Code Online (Sandbox Code Playgroud)


Sal*_*oli 11

在我的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"
Run Code Online (Sandbox Code Playgroud)

根据MySQL 5.6 Documentation,sql_mode是默认的

MySQL 5.6.5中的空白字符串和5.6.6 +中的NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

mysql 5.6参考


Ale*_*iro 11

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

$ sudo nano /etc/mysql/conf.d/mysql.cnf
Run Code Online (Sandbox Code Playgroud)

包括如下所示的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
Run Code Online (Sandbox Code Playgroud)

请注意,在我的情况下,我删除了模式STRICT_TRANS_TABLES和ONLY_FULL_GROUP_BY.

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

之后,要对修改后的配置采取行动,重新启动mysql服务:

$ sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)

尝试访问mysql:

$ mysql -u user_name -p
Run Code Online (Sandbox Code Playgroud)

如果您能够登录并访问MySQL控制台,那就没问题.大!

但是,如果像我一样,你面临错误"未知变量sql_mode",这表明sql_modemysqld的一个选项,你将不得不返回,再次编辑文件mysql.cnf并更改[mysql][mysqld].重新启动MySQL服务并尝试在MySQL控制台上登录进行最后一次测试.这里是!

  • 感谢@alexandre-ribeiro,我强烈推荐上述方法,而不是在会议上设置它。对于那些拥有 Ubuntu 16.04 和 mysql 5.7.x 的用户,最好编辑该文件并在 *[mysqld]* 组下输入 _ini_ 指令 *sql_mode=&lt;theModes&gt;*,因为针对 *[mysql]* 声明不起作用,因为根据我的经验。 (2认同)

小智 9

这是我为修复Mysql工作台而执行的操作:

在通过以下命令获得当前值之前

SELECT @@sql_mode 
Run Code Online (Sandbox Code Playgroud)

后来我从列表中删除了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'
Run Code Online (Sandbox Code Playgroud)


inf*_*mer 9

这对我有用:

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)


Aam*_*irR 8

对于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
Run Code Online (Sandbox Code Playgroud)

粘贴以下内容:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

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

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

希望能对某人有所帮助!


cwh*_*rer 7

我正在使用doctrine,我在doctrine.local.php中添加了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',''))"
                ),
            ),
        ),
    ),
));
Run Code Online (Sandbox Code Playgroud)

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

  • 使用yaml表示法来配置Doctrine(在Symfony中完成)你需要使用"1002"而不是常量"PDO :: MYSQL_ATTR_INIT_COMMAND",但是这是我几周前一直在寻找的并且找不到的东西出.谢谢你的解决方案!为我工作. (3认同)

Hir*_*hut 7

如果您正在使用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
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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


Mat*_*ony 6

添加行

sql-mode=""
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*aio 5

对于运行带有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
Run Code Online (Sandbox Code Playgroud)
  1. 通过 SFTP - SSH (root) 连接到您的服务器并下载文件 /etc/my.cnf

  2. my.cnf在本地 PC 上使用文本编辑器文件打开并将[mysqld]您在步骤 (2) 中复制的整行粘贴到其中(在部分下),但删除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
Run Code Online (Sandbox Code Playgroud)
  1. 保存my.cnf文件并将其上传回/etc/

  2. 输入 WHM 并转到“WHM > 重新启动服务 > SQL Server (MySQL)”并重新启动服务


Tai*_*aiz 5

  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. 重新启动您的 Web 应用服务器

  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 服务器

    须藤 /usr/local/bin/mysql.server 重启

    或者

    brew 服务重启 mysql