Mysql-sql_mode-1064错误

MySql版本: 5.7
环境: MacOS, Docker

错误

最近在本地Docker的mysql上编写SQL时,使用group by并且使用了第二个字段,报了这个错误

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

查看了一下sql_mode

select @@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

错误探索过程

Google了一下,发现出现这个问题的同学还挺多(暗自高兴)。。。
网友的说法是:假如sql_mode指定了only_full_group_by,那么select后面只能存在group by的字段
MySql官方的说法是:假如sql_mode=only_full_group_by,不可以引用非聚合的字段,假如确实想用,需要使用ANY_VALUE()

Google上的一些说法

  • 在会话中设置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

实际上,当前会话我也不生效

  • 去/etc/mysql/mysql.conf.d/mysqld.cnf增加一行
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

实际上,我找不到这个文件
综上,我推测:网友既然这么说了,他们肯定是成功了的,但是,在哪个配置文件上面加,文件在哪里,可能windows,linux,mac,docker都有点不同。

最终解决办法

-- 进入安装mysql的容器
docker excc -it docker_name /bin/bash

-- 找到几个可能的文件
find . -name "*.cnf"
-- 文件列表是
./etc/pki/tls/openssl.cnf
./etc/my.cnf
./var/lib/mysql/auto.cnf
./healthcheck.cnf

-- 打开每个文件,看看哪个文件比较有可能。。。TMD只是有可能
我在my.cnf这个文件,发现了这个session `[mysqld]`,所以大胆地在这个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

-- 退出容器,重启容器
docker restart container_name

伟岸的我解决这个问题了。。。

posted @ 2021-03-31 14:54  followDreamLgx  阅读(128)  评论(0编辑  收藏  举报