禁用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不兼容 “做这些步骤:
-
sudo nano /etc/mysql/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"
-
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_mode是mysqld的一个选项,您将不得不返回,再次编辑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"