原文:MySQL之SQL mode——检查官

MySQL升级后代码出bug?

前段时间,测试的MySQL服务器进行了一次升级,从MySQL5.6升级到了MySQL5.7。以为是简单的升级,不会影响到代码,没想到重启应用后,首页就报错了,部分错误日志如下:

Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

SQL分析

定位到出错的行数,发现是如下SQL出错的(当然下面只是类似生产SQL的栗子):

select name, count(*) from student;

果然在MySQL5.6中执行通过,在MySQL5.7中执行报上面的错误!

原因分析

由于对MySQL不太熟悉,于是网上搜索,发现是因为MySQL5.6和MySQL5.7的SQL mode不一致导致的。本地的MySQL是5.6,用命令show global variables like '%sql_mode%'查看系统变量发现:

sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

而测试服务器的变量,则整整有8个之多:

sql_mode=ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

一下跳出这么多它不认识我我也不认识它的甲骨文,搞不懂什么含义。不过,所谓的SQL模式说白了就是定义MySQL支持哪些SQL语法,应该执行哪些数据校验,它就是MySQL的检察官。在MySQL5.6及以前中,一些不太合乎标准的写法,MySQL也没有明令禁止而是默许,但是到了MySQL5.7及以后,‘法律’一下严格起来,三令五申默认以前这些灰色行为现在都是‘违法’的了。

如何解决

无非有两种方式:

1. 人微言轻,个人老老实实的改正自己的错误(改自己的SQL),符合法律规范

select name, count(*) from student group by name;
  1. 法不责众,由于历史或其他原因,代码中很多不规范SQL运行很多年了,修改法律
set session sql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

使用set修改环境变量,在服务器重启后会失效,所以应该修改my.cnf配置:

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

附录:各版本的变更

指的都是默认设置

5.6以前:默认为

5.6.6NO_ENGINE_SUBSTITUTION

5.7.5ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLES

5.7.7NO_AUTO_CREATE_USER

5.7.8ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, NO_ZERO_IN_DATE

最新文章

  1. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
  2. fmdb 数据库的基本操作
  3. 初识Python第三天(一)
  4. spring + spring mvc可能会遇到的问题
  5. CSS组件架构的设计思想
  6. python练习程序(c100经典例3)
  7. jquery中邮箱地址 URL网站地址正则验证实例代码
  8. uboot启动后在内存中运行裸机程序hello
  9. CSS3学习系列之字体
  10. Android java.io.FileNotFoundException:*** (Permission denied)
  11. Python 学习教程汇总
  12. [原创]手把手教你写网络爬虫(7):URL去重
  13. DD常用命令组合
  14. python基础教程002_列表与元组
  15. codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
  16. c++ 算法 栅格中两点之间连线
  17. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
  18. vue 笔记备份
  19. 【react 样式】给react组件指定style
  20. bzoj 1012 基础线段树

热门文章

  1. 小米开源文件管理器MiCodeFileExplorer-源码研究(1)-2个模型Model
  2. LightOJ 1300 Odd Personality
  3. Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))
  4. 数据结构(C实现)------- 单链表
  5. 互联网+时代IT管理者的转型
  6. android 弹幕评论效果
  7. 8.Maven之(八)约定优于配置
  8. 【Codeforces Round #455 (Div. 2) A】Generate Login
  9. 【LightOJ - 1205】Palindromic Numbers
  10. CSU1660: K-Cycle