我意外启用了ONLY_FUL_GROUP_BY模式,如下所示:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
如何禁用它?
我意外启用了ONLY_FUL_GROUP_BY模式,如下所示:
SET sql_mode = '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_FUL_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控制台。给你!
其他回答
借助以下查询禁用ONLY_FUL_GROUP_BY。
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
要启用ONLY_FUL_GROUP_BY,请使用以下查询。
SET sql_mode = 'ONLY_FULL_GROUP_BY';
MySQL文档还指定了以下方法:
在选项文件(如my.cnf(Unix操作系统)或my.ini(Windows))中设置sql mode=“<mode>”。要通过命令行在服务器启动时设置SQL模式,请使用--SQL mode=“<modes>”选项。
*其中<modes>是用逗号分隔的不同模式列表。
要显式清除SQL模式,请在命令行上使用--sqlmode=“”或在选项文件中使用sqlmode=”将其设置为空字符串。
我在/etc/my.cnf中添加了sqlmode=“”选项,并成功了。
这个SO解决方案讨论了找出MySQL正在使用哪个my.cnf文件的方法。
进行更改后不要忘记重新启动MySQL。
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-提示集变量
小心使用
SET sql_mode = ''
这实际上清除了当前启用的所有模式。如果你不想弄乱其他设置,你可以做一个
SELECT @@sql_mode
首先,要获得一个以逗号分隔的启用模式列表,然后将其设置为该列表,而不使用ONLY_FUL_GROUP_BY选项。
使用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'