停用ONLY_FULL_GROUP_BY


614

我不小心启用了ONLY_FULL_GROUP_BY模式,如下所示:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

如何禁用它?


38
你试过了SET sql_mode = ''吗?
Tripp Kinetics 2014年

4
您为什么要禁用一种使MySQL更好地符合SQL标准的模式,又要教您在编写查询时更加谨慎的一种模式?
Andriy M 2014年

34
从Mysql 5.7开始,您也可以使用ANY_VALUE(column)函数来改进查询。在此处
Qoheleth-Tech

3
@AndriyM我需要尽快使用它,因为我要将旧应用程序的全部负载移植到新服务器上,并且无论我是否有源代码,它们都需要工作。
Jaydee

8
@AndriyM因为如果按唯一索引列进行分组,那么我已经知道每一行都是唯一的-通过命令为每行添加单独的分组。单。柱。在桌子上是一种皇家痛苦。
Benubird

Answers:


1163

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

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

你可以在这里阅读更多

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

  • 打开phpmyadmin并选择localhost
  • 单击菜单变量并向下滚动至sql模式
  • 单击编辑按钮以更改值并删除ONLY_FULL_GROUP_BY,然后单击保存。 在此处输入图片说明

12
此解决方案可以在mySQL 5.7.11上正常工作,应该是公认的解决方案。可接受的答案不适用于新版本的mySQL
Anyone_ph

4
只是保证。没关系REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''),MySQL无论如何都会从记录中删除不需要的逗号。OP的答案是正确的。
nawfal

40
这可行,但是当我重新启动mysql服务器时,恢复了默认设置...为什么?有持久的解决方案吗?谢谢!
Vincent Pazeller

52
要回答我的问题(持久解决方案):您必须将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”
Vincent Pazeller

21
GLOBAL没为我工作,但SESSION做了。SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
安德烈(Andre)'18年

371

更新:

在此处输入图片说明

为了保持您当前的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所有用户


2
对我来说,在同一行上设置mysqld标签没有用,但是在换行符下也可以使用:)谢谢
bloub 2016年

23
对于ubuntu,自定义配置值所在的文件是/etc/mysql/mysql.conf.d/mysqld.cnf
knb

5
这适用于Ubuntu 16.04(14到16个升级麻烦..)。/etc/mysql/my.cnf是正确的文件。knb提及的文件至少包含在此my.cnf文件中,至少在16.04中(配置现在分成多个文件)。
jwinn '16

2
使用“ SELECT @@ sql_mode;” 在进行更改之前先查看当前处于哪种模式。
ZbigniewLedwoń17年

1
您将看到的实际位置[mysqld]可能不在此文件中,而可能在包含目录中。首先使用此命令:grep -R "\[mysqld\]" *查看其中的内容-为此,请尝试grep -R "\bsql_mode\b" *
Oliver Williams

203

小心使用

SET sql_mode = '' 

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

SELECT @@sql_mode 

首先,获取以逗号分隔的启用模式列表,然后将其设置为不带ONLY_FULL_GROUP_BY选项的该列表。


最好的方法是什么then SET it to this list without the ONLY_FULL_GROUP_BY option.
凯文·梅雷迪斯

4
@KevinMeredith我对文档的阅读是无法一次打开/关闭一种模式–所有示例都要求您提供以逗号分隔的所需列表-例如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';
William Turrell

1
如果这是永久更改,请使用以下行编辑my.cnf:,sql_mode=<comma-separated-list>然后停止并启动服务器。请按照您所用操作系统的文档获取my.cnf的位置以及最佳编辑方式。
布莱克伍德

107

试试看:

SET sql_mode = ''

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


11
哇,''= 'full group by is disabled'?MySQL做一些非常愚蠢的事情,但是那是存在的。
亚伦·伯特兰

38
我认为这基本上禁用了任何sql模式;
ZviBar 2014年

这对我不起作用。我看到了0 rows affected,但我的查询仍然不起作用:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber

10
在尝试此答案之前,请务必先查看Machavity的警告,如果您希望更改继续存在,请确保在命令中使用global
thomas88wp

6
一段时间之后,每次回到MySql时,我总是遇到困扰我的问题,因为我总是忘记了问题所在:)当您认为它正在运行而现在却没有时,这种感觉令人失望由于版本更改。
X-HuMan

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;

@RémiBreton:您的MySQL版本是什么?
威远

6
这确实有效。但是在重新启动系统(ubuntu 16.04)之后,sql_mode回滚到以前的值。我现在能做什么?
pktangyue

太棒了,为我工作,只需要我永久转换一下即可
费尔南多·托雷斯

73

仅将一种模式添加到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


这是一个很好的答案!谢谢。
wedi

这是全局连接还是当前连接?好答案!
奥利弗·M·格里奇

48

感谢@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',''))"

这对我来说很好。


1
如果需要与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已经通过doctrine.dbal.charset cofnig对其进行了设置:symfony.com/doc/current/reference/configuration/doctrine.html,并且可以通过PDO dns正确执行,SET NAMES是一种过时的方式,不应将其用于大于5.3的PHP版本
LPodolski

39

上:

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

做:

$ 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更新覆盖吗?
低语者

1
@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
-Jadeye

我试过了,它在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代替很重要
rubo77

即使在mysql服务器重启后也可以使用
Akshay Khale

36

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

要删除特定的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值拒绝,您可以在此处了解更多信息


3
ANY_VALUE()
Sithu

25

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。


1
这是对我的正确答案`Ver 14.14 Distrib 5.7.10,适用于osx10.11(x86_64)`
Sinux

这应该标记为正确答案。其他答案未提供永久解决方案。
sijpkes

@ br3nt如何检测当前使用的模式,以便在不想取消所有模式的情况下仅删除不需要的模式?
simgineer

1
尝试SELECT @@GLOBAL.sql_mode;
br3nt

19

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

检出这张图片


有没有理由在我的WAMP安装中没有MySQL设置?有服务管理和MySQL控制台,但没有设置吗?
Craig

这正是我想要的!感谢您提供简单的WAMP Server解决方案!在尝试在本教程中进行#聚合时,我需要此功能:youtu.be/HXV3zeQKqGY?
t=9718

12

在我的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中返回空白字符串,并在5.6.6 +中返回NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

mysql 5.6参考


其他答案声称sql_mode := ''是可能的。你为什么不同意?
赫尔曼·德佩斯(HermannDöppes)”

字符串中所有这些选项从何而来?这背后的原因是什么?
HermannDöppes

据到MySQL 5.6的文档,是的sql_mode默认是在MySQL 5.6.5空字符串和背部NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES在5.6.6 dev.mysql.com/doc/refman/5.6/en/...
萨尔瓦托雷那不勒斯

感谢我在Ubuntu 16.04上为我工作-mysql Ver 14.14 Distrib 5.7.18,适用于Linux(x86_64),使用EditLine包装器
Paul

12

在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控制台,则可以。大!

但是,如果像我一样,您会遇到错误“未知变量sql_mode”,这表明sql_modemysqld的选项,您将不得不返回,再次编辑文件mysql.cnf并将其更改[mysql][mysqld]。重新启动MySQL服务,并做最后一次测试,尝试登录MySQL控制台。这里是!


1
由于@ alexandre-ribeiro,我强烈建议使用上述方法,而不是在会议上进行设置。对于拥有Ubuntu 16.04和mysql 5.7.x的用户,更好地编辑该文件并在[mysqld]组下输入ini指令sql_mode = <modes>,因为根据我的经验,对[mysql]进行声明无效。
codarrior

我有MySQL 5.7.22。很奇怪,但是如上所述,我必须从my.cnf的sql_mode声明中同时删除STRICT_TRANS_TABLES和ONLY_FULL_GROUP_BY,才能正常工作。实际上,我只想删除ONLY_FULL_GROUP_BY模式。如果执行“设置全局/会话sql_mode = ...”,则可以仅删除ONLY_FULL_GROUP_BY,而不必删除STRICT_TRANS_TABLES即可正常工作。但是由于重启后无法生存,所以对我来说并没有太大用处。
RayCh

12

这是我为修复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'

10

对于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/

希望能对某人有所帮助!


10

添加或删除模式到 sql_mode

MySQL 5.7.9或更高版本

要从添加或删除模式sql_mode,您可以使用list_addlist_drop功能。

要从current模式中删除一个模式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[原文]

当前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模式,请使用--sql-mode="modes"命令行sql-mode="modes"上的选项,或使用my.cnf(Unix操作系统)或my.ini(Windows)之类的选项文件。[原文]

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

[mysqld]

sql-mode="NO_ENGINE_SUBSTITUTION" #default <= 5.7.4

预设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

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

MySQL 5.7.7

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

MySQL> = 5.7.5,<= 5.7.6

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION

MySQL> = 5.6.6,<= 5.7.4

NO_ENGINE_SUBSTITUTION

MySQL <= 5.6.5

''

8

如果您使用的是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

到目前为止,此答案适用于8.0.13
tomexsans

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',''))"
                ),
            ),
        ),
    ),
));

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


3
使用yaml表示法配置教义(如Symfony中所做的那样),您需要使用“ 1002”而不是常量“ PDO :: MYSQL_ATTR_INIT_COMMAND”,但这是我几周前一直在寻找的东西,但找不到出来。感谢您的解决方案!为我工作。
Arvid

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
  1. 通过SFTP-SSH(根)连接到服务器并下载文件 /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
  1. 保存my.cnf文件并将其上传回/etc/

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


4

我正在使用mysql并已向root用户注册,适用于我的解决方案如下:

mysql> SET SESSION sql_mode =(选择替换(@@ sql_mode,'ONLY_FULL_GROUP_BY',''));


3

这是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

如果您能够正确登录,则应立即进行设置。


1

您可以使用配置文件禁用它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"

1

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

为了解决“这与sql_mode = only_full_group_by不兼容”:打开phpmyadmin并转到Home Page,然后选择“ Variables”子菜单。向下滚动以查找sql​​模式。编辑sql模式并删除'ONLY_FULL_GROUP_BY'保存。


0

使用MySQL 5.7.28版本进行检查并使用
SELECT @@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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.