zoukankan      html  css  js  c++  java
  • 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
    

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

  • 相关阅读:
    Vmstat主要关注哪些数据?
    Swap是个什么东东?
    Buffers与cached啥区别
    做错的题目——关于构造器返回值
    做错的题目——this的指向
    JS判断一个数是否为质数
    数组扁平化
    JS实现快速排序
    正则实现千分符
    获取鼠标的当前位置
  • 原文地址:https://www.cnblogs.com/suimeng/p/mysql-sql_mode_only_full_group_by.html
Copyright © 2011-2022 走看看