Zvi*_*Bar 538 mysql mysql-workbench
我不小心启用了ONLY_FULL_GROUP_BY这样的模式:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
Run Code Online (Sandbox Code Playgroud)
我该如何禁用它?
Eyo*_*Eyo 1026
解决方案1:从mysql控制台中 删除ONLY_FULL_GROUP_BY
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)
你可以在这里阅读更多
解决方案2:从phpmyadmin中删除ONLY_FULL_GROUP_BY
bre*_*req 349
要保持当前的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"
Run Code Online (Sandbox Code Playgroud)sudo service mysql restart 重启MySQL
这将禁用ONLY_FULL_GROUP_BY对所有用户
Tar*_*ran 198
小心使用
SET sql_mode = ''
Run Code Online (Sandbox Code Playgroud)
这实际上清除了当前启用的所有模式.如果你不想搞乱其他设置,你会想做一个
SELECT @@sql_mode
Run Code Online (Sandbox Code Playgroud)
首先,要获取启用模式的逗号分隔列表,然后将其设置为此列表而不使用该ONLY_FULL_GROUP_BY选项.
Tri*_*ics 107
尝试一下:
SET sql_mode = ''
Run Code Online (Sandbox Code Playgroud)
社区注意:正如下面的答案所指出的,这实际上清除了当前启用的所有 SQL模式.这可能不一定是你想要的.
Wei*_*uan 106
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;
Run Code Online (Sandbox Code Playgroud)
Jan*_*sha 64
仅向sql_mode添加一种模式而不删除现有模式:
SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));
Run Code Online (Sandbox Code Playgroud)
从sql_mode中仅删除特定模式而不删除其他模式:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));
Run Code Online (Sandbox Code Playgroud)
在您的情况下,如果您只想删除ONLY_FULL_GROUP_BY模式,请使用以下命令:
SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Run Code Online (Sandbox Code Playgroud)
参考:http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html
Arv*_*vid 47
感谢@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',''))"
Run Code Online (Sandbox Code Playgroud)
这对我来说很好.
Jad*_*eye 34
上:
做:
$ sudo nano /etc/mysql/conf.d/mysql.cnf
Run Code Online (Sandbox Code Playgroud)
复制和粘贴:
[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
Run Code Online (Sandbox Code Playgroud)
到文件的底部
$ sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)
Waq*_*leh 31
我注意到,只要MySQL服务器没有重启,@ Eyo Okon Eyo解决方案就可以工作,然后恢复默认设置.这是一个对我有用的永久解决方案:
要删除特定的SQL模式(在本例中为ONLY_FULL_GROUP_BY),请查找当前的SQL模式:
SELECT @@GLOBAL.sql_mode;
Run Code Online (Sandbox Code Playgroud)
复制结果并从中删除不需要的内容(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
Run Code Online (Sandbox Code Playgroud)
至
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)
创建并打开此文件:
/etc/mysql/conf.d/disable_strict_mode.cnf
Run Code Online (Sandbox Code Playgroud)
并编写并过去你的新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
Run Code Online (Sandbox Code Playgroud)
重启MySQL:
sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)
或者您可以使用ANY_VALUE()抑制ONLY_FULL_GROUP_BY值拒绝,您可以在此处阅读更多相关信息
br3*_*3nt 24
在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.
Ank*_*dal 23
从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的默认值:
SELECT @@sql_mode
Run Code Online (Sandbox Code Playgroud)
ONLY_FULL_GROUP_BY-通过执行以下查询从控制台删除:
SET GLOBAL sql_mode=
(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Run Code Online (Sandbox Code Playgroud)
方法二:
访问 phpmyadmin 编辑您的sql_mode
重启MySQL服务器
sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)
或者
注销phpmyadmin并重新登录。
小智 20
借助以下查询禁用 ONLY_FULL_GROUP_BY。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)
并启用 ONLY_FULL_GROUP_BY 使用以下查询。
SET sql_mode = 'ONLY_FULL_GROUP_BY';
Run Code Online (Sandbox Code Playgroud)
fyr*_*rye 18
sql_modeMySQL 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');
Run Code Online (Sandbox Code Playgroud)
从GLOBAL.sql_mode当前运行时操作中删除模式,直到服务重新启动。
SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');
Run Code Online (Sandbox Code Playgroud)
MySQL 5.7.8 或更低版本
由于该sql_mode值是模式的 CSV 字符串,您需要确保该字符串不包含残留的逗号,这可以通过使用TRIM(BOTH ',' FROM ...).
要从sql_mode变量中删除模式,您需要REPLACE()与 with 一起使用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', ''));
Run Code Online (Sandbox Code Playgroud)
要将模式添加到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));
Run Code Online (Sandbox Code Playgroud)
注:更改
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;
Run Code Online (Sandbox Code Playgroud)
将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 |
+--------------------+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
将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 |
+----------------------------------------------+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅选项文件语法。
在选项文件中指定选项的语法类似于命令行语法。但是,在选项文件中,您可以省略选项名称中前导的两个破折号,并且每行仅指定一个选项。例如,在命令行上的
--quick和--host=localhost应该在选项文件中的单独行中指定为quick和host=localhost。要--loose-opt_name在选项文件中指定表单的选项,请将其写为loose-opt_name.
该值可以可选地括在单引号或双引号中,如果该值包含
#注释字符,这将很有用。
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
MySQL 5.7.7
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)
MySQL >= 5.7.5,<= 5.7.6
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)
MySQL >= 5.6.6,<= 5.7.4
NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)
MySQL <= 5.6.5
''
Run Code Online (Sandbox Code Playgroud)
Sal*_*oli 11
在我的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"
Run Code Online (Sandbox Code Playgroud)
根据MySQL 5.6 Documentation,sql_mode是默认的
MySQL 5.6.5中的空白字符串和5.6.6 +中的NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ale*_*iro 11
在MySQL 5.7和Ubuntu 16.04上,编辑mysql.cnf文件.
$ sudo nano /etc/mysql/conf.d/mysql.cnf
Run Code Online (Sandbox Code Playgroud)
包括如下所示的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
Run Code Online (Sandbox Code Playgroud)
请注意,在我的情况下,我删除了模式STRICT_TRANS_TABLES和ONLY_FULL_GROUP_BY.
这样做,它将永久保存模式配置.不同的是,如果您只是通过MySQL更新@@ sql_mode,因为它将在机器/服务重启时重置.
之后,要对修改后的配置采取行动,重新启动mysql服务:
$ sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)
尝试访问mysql:
$ mysql -u user_name -p
Run Code Online (Sandbox Code Playgroud)
如果您能够登录并访问MySQL控制台,那就没问题.大!
但是,如果像我一样,你面临错误"未知变量sql_mode",这表明sql_mode是mysqld的一个选项,你将不得不返回,再次编辑文件mysql.cnf并更改[mysql]为[mysqld].重新启动MySQL服务并尝试在MySQL控制台上登录进行最后一次测试.这里是!
小智 9
这是我为修复Mysql工作台而执行的操作:
在通过以下命令获得当前值之前
SELECT @@sql_mode
Run Code Online (Sandbox Code Playgroud)
后来我从列表中删除了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'
Run Code Online (Sandbox Code Playgroud)
这对我有用:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)
对于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
Run Code Online (Sandbox Code Playgroud)
粘贴以下内容:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)
的快捷键来保存并退出nano:Ctrl+x和y和Enter
注意:您可能需要mysql-5.7.24-macos10.14-x86_64在这些命令中进行更新,只需检查您在其中获得的正确文件夹名称/usr/local/
希望能对某人有所帮助!
我正在使用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',''))"
),
),
),
),
));
Run Code Online (Sandbox Code Playgroud)
在phpmyadmin中,用户需要在权限中激活SUPER.
如果您正在使用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
Run Code Online (Sandbox Code Playgroud)
小智 6
我使用 mysql 并使用 root 用户注册,对我有用的解决方案如下:
mysql > SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
对于运行带有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
Run Code Online (Sandbox Code Playgroud)
通过 SFTP - SSH (root) 连接到您的服务器并下载文件 /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
Run Code Online (Sandbox Code Playgroud)
保存my.cnf文件并将其上传回/etc/
输入 WHM 并转到“WHM > 重新启动服务 > SQL Server (MySQL)”并重新启动服务
检查 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',''));
重新启动您的 Web 应用服务器
访问导致此问题的页面。它现在可以工作了。
或者
在 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 服务器
须藤 /usr/local/bin/mysql.server 重启
或者
brew 服务重启 mysql