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
伟岸的我解决这个问题了。。。