禁用ONLY_FULL_GROUP_BY

我意外地启用了ONLY_FULL_GROUP_BY模式,如下所示:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

我如何禁用它?

1429836 次浏览

试试这个:

SET sql_mode = ''

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

小心使用

SET sql_mode = ''

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

SELECT @@sql_mode

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

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。

    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;

解决方案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并单击保存。输入图片描述

更新时间:

在此处输入图片描述

要保留您当前的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 to restart MySQL

This will disable ONLY_FULL_GROUP_BY for ALL users

仅向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

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

检查此图像

我正在使用原则,我在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。

关于:

  • ubuntu 14.04
  • MySQL Ver 14.14 DETRIB 5.7.16,用于使用EditLine包装器的Linux(x86_64)

做:

$ 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

谢谢你的帮助。我在Symfony应用程序中遇到了同样的问题。我刚刚将选项添加到我的config.yml:

doctrine:dbal:driver:   pdo_mysqloptions:# PDO::MYSQL_ATTR_INIT_COMMAND1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

这对我来说工作得很好。

在我的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_TABLES5.6.6+

mysql 5.6参考

我注意到,只要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值拒绝,你可以阅读更多关于它在这里

在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控制台。在这里!

您可以使用配置文件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 localhostbind-address = 127.0.0.1sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

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

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

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

如果您能够无错误地登录-您现在应该全部设置。

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

对于使用cPanel/WHM运行VPS/Server的用户,您可以执行以下操作来永久禁用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_BYsql_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服务器(MySQL)”并重新启动服务

这是我在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'

对于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/中的正确文件夹名称

希望它能帮助别人!

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

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

添加或删除模式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中的值。[原文如此]

当前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版本以确定支持和默认的模式

MySQL>=5.7.5,<=5.7.6默认

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

请参阅选项文件语法以获取更多信息。

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

值可以选择用单引号括起来或双引号,如果值包含#,这很有用注释字符。

默认值sql_mode

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

mysql>=8.0.118.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

''

使用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'

如果您在sql_mode上有ANSI,请注意:

相当于REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE和(从MySQL 5.7.5开始)ONLY_FULL_GROUP_BY。

https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_ansi

从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
  • Top on变量出现在菜单项的顶部并搜索sql模式
  • 点击编辑按钮删除ONLY_FULL_GROUP_BY并保存phpmyadmin中的sql模式设置

重启mysql服务器

 sudo service mysql restart

注销phpmyadmin并再次登录。

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

这对我有效:

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

最好是尝试在新项目上使用ONLY_FULL_GROUP_BY,同时在现有站点和数据库上保持向下兼容。为此,我选择在加载mysqli时修改SQL模式,分别在我的课程中加载PDO。

对于mysqli:

mysqli_query($this->link,"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))");

对于PDO类:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

使用PDO init的示例:

try {$dns     = 'mysql:host=localhost;dbname=' . $prod_db;$user    = _DBUSER_;$pass    = _DBPASS_;$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))");
$db = new PDO($dns, $user, $pass, $options);}
catch(Exception $e) {mail("contact@xxxxxx.xx","Database Error ",$dns.",".$user);echo "Unable ot connect to mySQL : ", $e->getMessage();die();}

因此,在同一台服务器上创建的新类将与新的数据库标准一起使用。

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

输入图片描述

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

选项,以防万一:

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

MySQL 8. x中的“优化器提示”呢?

例如:

SELECT /*+ SET_VAR(sql_mode='STRICT_TRANS_TABLES') */... rest of query

更多信息:https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html#optimizer-hints-set-var

如果其他人遇到和我一样的问题。在Ubuntu 16.04上,它对我唯一有效的持久解决方案:

编辑 /lib/systemd/system/mysql.service并将其设置为:

[Unit]Description=MySQL Community ServerAfter=network.target
[Install]WantedBy=multi-user.target
[Service]User=mysqlGroup=mysqlPermissionsStartOnly=trueExecStartPre=/usr/share/mysql/mysql-systemd-start pre# Normally, we'd simply use:# ExecStart=/usr/sbin/mysqldExecStart=/usr/sbin/mysqld --sql-mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONExecStartPost=/usr/share/mysql/mysql-systemd-start postTimeoutSec=600Restart=on-failureRuntimeDirectory=mysqldRuntimeDirectoryMode=755`
  1. 检查sql_mode的默认值:

    选择@@sql_mode;

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

设置全局sql_mode=(选择替换(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

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

使用database_name;

sql_mode=(选择替换(@@sql_mode,ONLY_FULL_GROUP_BY',''));

  1. 重新启动您的Web应用服务器

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

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

    sql_mode="传统"

备注:如果您使用的是macmy.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

要在以下查询的帮助下禁用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';

添加行

sql-mode=""

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