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;
- 法不责众,由于历史或其他原因,代码中很多不规范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.6:NO_ENGINE_SUBSTITUTION
5.7.5:ONLY_FULL_GROUP_BY
、STRICT_TRANS_TABLES
5.7.7:NO_AUTO_CREATE_USER
5.7.8:ERROR_FOR_DIVISION_BY_ZERO
, NO_ZERO_DATE, NO_ZERO_IN_DATE
最新文章
- Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
- fmdb 数据库的基本操作
- 初识Python第三天(一)
- spring + spring mvc可能会遇到的问题
- CSS组件架构的设计思想
- python练习程序(c100经典例3)
- jquery中邮箱地址 URL网站地址正则验证实例代码
- uboot启动后在内存中运行裸机程序hello
- CSS3学习系列之字体
- Android java.io.FileNotFoundException:*** (Permission denied)
- Python 学习教程汇总
- [原创]手把手教你写网络爬虫(7):URL去重
- DD常用命令组合
- python基础教程002_列表与元组
- codeforces 741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
- c++ 算法 栅格中两点之间连线
- [CodePlus 2017 11月赛&;洛谷P4058]木材 题解(二分答案)
- vue 笔记备份
- 【react 样式】给react组件指定style
- bzoj 1012 基础线段树
热门文章
- 小米开源文件管理器MiCodeFileExplorer-源码研究(1)-2个模型Model
- LightOJ 1300 Odd Personality
- Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))
- 数据结构(C实现)------- 单链表
- 互联网+时代IT管理者的转型
- android 弹幕评论效果
- 8.Maven之(八)约定优于配置
- 【Codeforces Round #455 (Div. 2) A】Generate Login
- 【LightOJ - 1205】Palindromic Numbers
- CSU1660: K-Cycle