我不小心启用了ONLY_FULL_GROUP_BY模式:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
如何禁用它?
答案 0 :(得分:890)
解决方案1: 从mysql控制台
中删除 ONLY_FULL_GROUP_BYmysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
您可以阅读更多here
解决方案2:从phpmyadmin移除 ONLY_FULL_GROUP_BY
答案 1 :(得分:330)
要保留当前的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&# 39;它在功能上不依赖于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
答案 2 :(得分:183)
小心使用
SET sql_mode = ''
这实际上清除了当前启用的所有模式。如果您不想弄乱其他设置,那么您将要执行
SELECT @@sql_mode
首先,要获取以逗号分隔的启用模式列表,然后将其设置为此列表而不使用ONLY_FULL_GROUP_BY
选项。
答案 3 :(得分:98)
尝试一下:
SET sql_mode = ''
社区注意:正如下面的答案所指出的,这实际上清除了所有当前启用的SQL模式。这可能不一定是你想要的。
答案 4 :(得分:95)
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;
答案 5 :(得分:60)
只向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
答案 6 :(得分:40)
感谢@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',''))"
这对我来说很好。
答案 7 :(得分:28)
在:
执行:
$ 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
答案 8 :(得分:26)
我注意到只要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价值拒绝,你可以read more about it here
答案 9 :(得分:23)
MySQL documentation还指定了以下方法:
sql-mode="<modes>"
。--sql-mode="<modes>"
选项。 *其中<modes>
是由逗号分隔的不同模式的列表。
要显式清除SQL模式,请在命令行上使用--sql-mode=""
将其设置为空字符串,或在选项文件中将其设置为sql-mode=""
。
我将sql-mode=""
选项添加到/etc/my.cnf
,但它确实有效。
This SO solution讨论了找出MySQL使用哪个my.cnf文件的方法。
在进行更改后不要忘记重启MySQL。
答案 10 :(得分:18)
答案 11 :(得分:10)
在我的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,5.6.6 +中的STRICT_TRANS_TABLES
答案 12 :(得分:10)
在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控制台上登录进行最后一次测试。在这里!
答案 13 :(得分:5)
我正在使用教条,我在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。
答案 14 :(得分: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
答案 15 :(得分:4)
对于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/
希望它将对某人有所帮助!
答案 16 :(得分:3)
sql_mode
添加或删除模式MySQL 5.7.9或更高版本
要在sql_mode
中添加或删除模式,可以使用list_add
和list_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
中的值。 [sic]
当前
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 mode 在服务器启动时,在命令上使用
--sql-mode="modes"
选项 行或选项文件中的sql-mode="modes"
,例如my.cnf(Unix 操作系统)或my.ini(Windows)。 [sic]
请查看您的MySQL版本,以确定受支持的默认modes。
[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION" #default <= 5.7.4
答案 17 :(得分:3)
这是我为修复Mysql工作台而执行的操作:
在通过以下命令获得当前值之前
break;
后来我从列表中删除了ONLY_FULL_GROUP_BY键,并粘贴了以下命令
SELECT @@sql_mode
答案 18 :(得分:2)
这是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
如果您能够无错误地登录 - 您现在应该全部设置。
答案 19 :(得分:2)
检查sql_mode的默认值:
选择@@sql_mode;
通过执行以下查询从控制台中删除 ONLY_FULL_GROUP_BY:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
使用数据库名称;
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
重启你的网络应用服务器
访问导致此问题的页面。它现在可以工作了。
或
在 my.cnf 文件中添加以下内容
sql_mode="传统"
注意:如果你使用的是 mac my.cnf 可能会在这里/usr/local/etc/my.cnf
或者试试这个链接https://dev.mysql.com/doc/refman/8.0/en/option-files.html
重启 MySQL 服务器
sudo /usr/local/bin/mysql.server restart
或
brew 服务重启mysql
答案 20 :(得分:2)
对于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
答案 21 :(得分:2)
对于使用 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
使用本地PC上的文本编辑器my.cnf
打开文件,然后将您在步骤(2)复制的整个行粘贴(在[mysqld]
部分下),但删除{{1} }
例如粘贴:
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
输入WHM并转到“ WHM>重新启动服务> SQL Server(MySQL)”并重新启动服务
答案 22 :(得分:1)
我正在使用mysql并已向root用户注册,因此适用于我的解决方案如下:
mysql> SET SESSION sql_mode =(选择 REPLACE(@@ sql_mode,'ONLY_FULL_GROUP_BY',''));
答案 23 :(得分:1)
从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
方法1:
检查sql_mode的默认值:
SELECT @@sql_mode
通过执行以下查询,从控制台中删除ONLY_FULL_GROUP_BY
:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
方法2:
访问phpmyadmin来编辑您的sql_mode
答案 24 :(得分:1)
最好尝试在新项目上使用 ONLY_FULL_GROUP_BY,同时在现有站点和数据库上保持向后兼容。为此,我选择在我的类中分别加载 mysqli 和 PDO 时修改 SQL 模式。
对于 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 初始化示例:
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();
}
因此,在同一台服务器上创建的新类将适用于新的数据库标准。
答案 25 :(得分:1)
万一使用 Drupal 8 的人在 mysql 8 中遇到这个问题,我通过添加这段代码来覆盖默认配置来解决这个问题。
答案 26 :(得分: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'
答案 27 :(得分:0)
要注意的一件事,如果您在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
答案 28 :(得分:0)
这对我有用:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
答案 29 :(得分:0)
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
答案 30 :(得分:0)
您可以使用配置文件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"
答案 31 :(得分:0)
在以下查询的帮助下禁用 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';
答案 32 :(得分:-1)
以下是我通过phpmyadmin仪表板更改Mysql配置的解决方案:
为了修复&#34;这与sql_mode = only_full_group_by&#34;不兼容: 打开phpmyadmin并转到主页并选择&#39;变量&#39;子菜单。向下滚动以查找sql模式。编辑sql模式并删除&#39; ONLY_FULL_GROUP_BY&#39;保存它。