zoukankan      html  css  js  c++  java
  • mysql之sql_mode问题

    今天在测试环境执行分组查询sql时报错:

    ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database_tl.emp.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

    可是相同的sql语句在开发环境运行正常,弄得我都一脸懵逼.

    查找相关资料得知--Mysql5.7版本中有了一个STRICT mode(严格模式),而在此模式下默认ONLY_FULL_GROUP_BY开启 ,而我们使用的mysql为5.8,所以想要解决这个问题,就需要修改sql_mode的值

    顺便看一下group by的语法:

    select 选取分组中的列+聚合函数 from 表名称 group by 分组的列 

    从语法格式来看,是先有分组,再确定检索的列,检索的列只能在参加分组的列中选。

    最优的解决方案肯定是规范sql语法--只选择出现在group by后面的列,或者给列增加聚合函数;

    下面的方法属于偏方 qwq..

    查看sql_model参数命令:

    SELECT @@GLOBAL.sql_mode;

    SELECT @@SESSION.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,测试mysql果然使用的是默认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';

    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';(全局)

    修改完成之后,必须管理所有连接,重新连接后查询即可.

     BUT网上也有大神说上面这种方式,若mysql重启,又会回复成默认sql_mode,他们的方法比较简单暴力---直接修改mysql的配置文件,而且修改后重启不会有任何影响.

    最后总结一下几种常见的mode

    ONLY_FULL_GROUP_BY:出现在select语句、HAVING条件和ORDER BY语句中的列,必须是GROUP BY的列或者依赖于GROUP BY列的函数列。

    NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

    STRICT_TRANS_TABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

    NO_ZERO_IN_DATE:这个模式影响了是否允许日期中的月份和日包含0。如果开启此模式,2016-01-00是不允许的,但是0000-02-01是允许的。它实际的行为受到 strict mode是否开启的影响1。

    NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期。它实际的行为受到 strictmode是否开启的影响2。

    ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时MySQL返回NULL

    NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户

    NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

    PIPES_AS_CONCAT:将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

    ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

  • 相关阅读:
    姐姐的vue(1)
    LeetCode 64. Minimum Path Sum 20170515
    LeetCode 56. 56. Merge Intervals 20170508
    LeetCode 26. Remove Duplicates from Sorted Array
    LeetCode 24. Swap Nodes in Pairs 20170424
    LeetCode 19. Remove Nth Node From End of List 20170417
    LeetCode No.9 Palindrome Number 20170410
    LeetCode No.8. String to Integer (atoi) 2017/4/10(补上一周)
    LeetCode No.7 Reverse Integer 2017/3/27
    LeetCode No.4 Median of Two Sorted Arrays 20170319
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/13680200.html
Copyright © 2011-2022 走看看