在用Navicat写MySQL命令时,出现以下错误:

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

具体看图:
在这里插入图片描述
首先来看错误提及的sql_mode=only_full_group_by的值的含义:
ONLY_FULL_GROUP_BY:
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中
因为有only_full_group_by,所以我们要在MySQL中正确的使用group by语句的话,只能是select column1 from tb1 group by column1(即只能展示group by的字段,其他均都要报1055的错)
所以我们要使用能正确的使用group by 的话就必须删除掉only_full_group_by

以下是具体操作:
以管理员身份进入DOS命令窗口,输入net start mysql命令启动MySQL:

C:\WINDOWS\system32>net start mysql

输入mysql -hlocalhost -uroot -p命令进入MySQL:

C:\WINDOWS\system32>mysql -hlocalhost -uroot -p

输入select @@global.sql_mode;命令查看SQL设置:

mysql> select @@global.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

通过查询结果,确定有ONLY_FULL_GROUP_BY,接下来就是要去掉它,以下是通过网上查询到的能够成功解决的方法,但亲自尝试后,却均未能成功,如有有兴趣的,可以尝试一下,没有兴趣的可以直接看方法3。

方法1(未成功):
输入set sql_mode=(select replace(@@sql_mode,‘ONLY_FULL_GROUP_BY’,’’));命令进行设置:

mysql> set sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Query OK, 0 rows affected (0.00 sec)

此命令执行没有问题,但通过查询却是发现并没有将ONLY_FULL_GROUP_BY通过替换方式去掉:

mysql> select @@global.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

方法2(未成功):
输入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 @@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';
ERROR 1231 (42000): Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'

错误显示’sql_mode’不能被设置’NO_AUTO_CREATE_USER’值。
通过对比发现,在原有的’sql_mode’值中,也并不存在’NO_AUTO_CREATE_USER’这个值,于是便对设置命令进行了删减。

方法3(成功):
输入set @@global.sql_mode = ‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’;进行设置:

mysql> set @@global.sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)

执行成功。

再通过select @@global.sql_mode;查询配置,得到的结果显示已经将‘ONLY_FULL_GROUP_BY’去除:

mysql> select @@global.sql_mode;
+----------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                  |
+----------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

根据查询结果,证明已经修改成功。

补充:
这种修改方式只是暂时性的修改,永久修改可以更改配置文件my.ini
sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

注意:
1、在网上查到的sql_mode配置中,大多包含有NO_AUTO_CREATE_USER,但如果在设置时出现方法2的错误提示,那在my.ini文件中进行更改配置时,也不要加NO_AUTO_CREATE_USER,否则在打开MySQL服务器时,就会提示MySQL服务器无法启动,服务没有报告任何错误:
在这里插入图片描述
相信我,这绝对是一个大坑,博主在查询解决服务器无法启动的解决方法时,发现有各种情况,比如端口被占用之类的,结果尝试了各种操作,浪费了大量时间,才因为一个突发的灵感,将my.ini中设置的NO_AUTO_CREATE_USER去掉,然后问题成功解决。
真的,当时真有点百感交集。

2、更改配置时,一定要放在[mysqld]下面,因为还有一个[mysql],这两者很容易混淆,如果不是放在[mysqld]下面,在启动MySQL的时候就会报以下错误:

C:\WINDOWS\system32>mysql -hlocalhost -uroot -p
mysql: [ERROR] unknown variable 'sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'.

也就是说,找不到这个配置了。

注意事项很重要,真要是忽略了,找问题将会非常麻烦,浪费大量时间,搞不好还会直接崩溃,后果极其严重,嗯,这些博主正好都经历了,教训可谓惨痛,请以此为鉴。

另,附解决问题后再使用Navicat写MySQL命令的效果:
在这里插入图片描述
话说,没有错误提示看着真舒服!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐