我不小心启用了ONLY_FULL_GROUP_BY模式,如下所示:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
如何禁用它?
column
)函数来改进查询。在此处
我不小心启用了ONLY_FULL_GROUP_BY模式,如下所示:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
如何禁用它?
column
)函数来改进查询。在此处
Answers:
解决方案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
REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')
,MySQL无论如何都会从记录中删除不需要的逗号。OP的答案是正确的。
GLOBAL
没为我工作,但SESSION
做了。SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'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不兼容 ”执行以下步骤:
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
对所有用户
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
可能不在此文件中,而可能在包含目录中。首先使用此命令:grep -R "\[mysqld\]" *
查看其中的内容-为此,请尝试grep -R "\bsql_mode\b" *
小心使用
SET sql_mode = ''
实际上,这将清除当前启用的所有模式。如果您不想弄乱其他设置,可以选择
SELECT @@sql_mode
首先,获取以逗号分隔的启用模式列表,然后将其设置为不带ONLY_FULL_GROUP_BY
选项的该列表。
then SET it to this list without the ONLY_FULL_GROUP_BY option.
?
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=<comma-separated-list>
然后停止并启动服务器。请按照您所用操作系统的文档获取my.cnf的位置以及最佳编辑方式。
试试看:
SET sql_mode = ''
社区说明:正如下面的答案所指出的,这实际上清除了当前启用的所有 SQL模式。那不一定是您想要的。
''
= 'full group by is disabled'
?MySQL做一些非常愚蠢的事情,但是那是存在的。
0 rows affected
,但我的查询仍然不起作用:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
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
回滚到以前的值。我现在能做什么?
仅将一种模式添加到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应用程序中,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',''))"
这对我来说很好。
SET NAMES
使用此方法进行设置,在大多数情况下,不需要symfony已经通过doctrine.dbal.charset cofnig对其进行了设置:symfony.com/doc/current/reference/configuration/doctrine.html,并且可以通过PDO dns正确执行,SET NAMES是一种过时的方式,不应将其用于大于5.3的PHP版本
上:
做:
$ 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
/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
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
代替很重要
我注意到,只要不重新启动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值拒绝,您可以在此处了解更多信息
ANY_VALUE()
在MySQL文档还规定了以下几种方法:
sql-mode="<modes>"
在选项文件中进行设置,例如my.cnf(Unix操作系统)或my.ini(Windows)。--sql-mode="<modes>"
选项。*这里<modes>
是用逗号分隔的不同模式的列表。
要显式清除SQL模式,请--sql-mode=""
在命令行或sql-mode=""
选项文件中使用将其设置为空字符串。
我添加了该sql-mode=""
选项/etc/my.cnf
,它起作用了。
该SO解决方案讨论了找出MySQL正在使用哪个my.cnf文件的方法。
进行更改后,请不要忘记重新启动MySQL。
SELECT @@GLOBAL.sql_mode;
在我的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
sql_mode := ''
是可能的。你为什么不同意?
在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_mode是mysqld的选项,您将不得不返回,再次编辑文件mysql.cnf并将其更改[mysql]
为[mysqld]
。重新启动MySQL服务,并做最后一次测试,尝试登录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+x
和y
和Enter
注意:您可能需要更新mysql-5.7.24-macos10.14-x86_64
在这些命令中,只需检查您在其中获得的正确文件夹名称/usr/local/
希望能对某人有所帮助!
sql_mode
MySQL 5.7.9或更高版本
要从添加或删除模式sql_mode
,您可以使用list_add
和list_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)之类的选项文件。[原文]
[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
''
如果您使用的是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
我正在使用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。
对于使用cPanel / WHM运行VPS /服务器的用户,您可以执行以下操作永久禁用ONLY_FULL_GROUP_BY
您需要root访问(在VPS或专用服务器上)
以root身份输入WHM并运行phpMyAdmin
单击变量,查找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
通过SFTP-SSH(根)连接到服务器并下载文件 /etc/my.cnf
使用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
保存my.cnf
文件并将其上传回/etc/
输入WHM并转到“ WHM>重新启动服务> SQL Server(MySQL)”,然后重新启动服务
我正在使用mysql并已向root用户注册,适用于我的解决方案如下:
mysql> SET SESSION sql_mode =(选择替换(@@ sql_mode,'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
如果您能够正确登录,则应立即进行设置。
您可以使用配置文件禁用它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"
SET sql_mode = ''
吗?