禁用ONLY_FULL_GROUP_BY

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

SET sql_mode = 'ONLY_FULL_GROUP_BY'; 

我如何禁用它?

在不清空sql_mode的情况下最好的方法

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

它为我工作,你可以在这里阅读更多

如果要永久禁用错误“ SELECT列表的expression式#N不在GROUP BY子句中,并且包含非聚集列'db.table.COL',它在function上不依赖于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

小心使用

 SET sql_mode = '' 

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

 SELECT @@sql_mode 

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

试试这个:

 SET sql_mode = '' 

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

  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; 

只添加一个模式到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

感谢@ cwhisperer。 在Symfony应用程序中,我有与学说相同的问题。 我刚刚添加到我的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',''))" 

这对我来说工作得很好。

MySQL文档还指定了以下方法:

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

*其中<modes>是用逗号分隔的不同模式的列表。

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

我添加了sql-mode=""选项到/etc/my.cnf ,它工作。

这个SO解决scheme讨论如何找出MySQL正在使用哪个my.cnf文件。

不要忘记进行更改后重新启动MySQL。

上:

  • Ubuntu 14.04
  • mysql版本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 

如果你正在使用WAMP。 左键单击WAMP图标,然后转到MySQL – > MySQL设置 – > sql-mode,然后selectsql-mode-> user模式

结帐这个图像

在我的sql(版本5.7.11在Mac OS X上运行)这个工作在我的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是默认的

空白string在MySQL 5.6.5和后面NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES在5.6.6 +

MySQL 5.6参考

我使用的教义,我已经在我的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。

我注意到@Eyo Okon Eyo解决scheme工作,只要MySQL服务器没有重新启动,然后默认设置被恢复。 这是一个永久的解决scheme,为我工作:

要删除特定的SQL模式(在本例中为ONLY_FULL_GROUP_BY ),请find当前的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 

创build并打开这个文件:

 /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。

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

之后,要修改configuration,请重新启动mysql服务:

 $ sudo service mysql restart 

尝试访问mysql:

 $ mysql -u user_name -p 

如果你能够login和访问MySQL控制台,那就OK了。 大!

但是 ,如果像我一样,遇到错误“未知variablessql_mode” ,这表明sql_modemysqld的一个选项,您将不得不返回,再次编辑mysql.cnf文件并将[mysql]更改为[mysqld] 。 重新启动MySQL服务,并尝试在MySQL控制台上进行最后的testing。 这里是!

这是我的解决scheme通过phpmyadmin仪表板更改Mysqlconfiguration:

为了解决“这是不符合sql_mode = only_full_group_by”:打开phpmyadmin和转到主页,并select“variables”子菜单。 向下滚动以查找sql​​模式。 编辑sql模式并删除“ONLY_FULL_GROUP_BY”保存。

您可以使用configuration文件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"