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
MySQL之SQL mode——检查官的更多相关文章
- Mysql 常用 SQL 语句集锦
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- PHP+MYSQL网站SQL Injection攻防
程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报 ...
- 【转】MySQL批量SQL插入各种性能优化
原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...
- Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)
Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...
- MySQL数据库sql语句的一些简单优化
1.查询条件的先后顺序 有多个查询条件时,要把效率高能更精确筛选记录的条件放在后边.因为MySQL解析sql语句是从后往前的(不知是否准确). 例: select a.*,b.* from UsrIn ...
- HP+MYSQL网站SQL Injection攻防
WebjxCom提示:程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程: ...
- MySQL与SQL比较有那些区别呢
MySQL是一个逐渐完善的过程,使用前期版本时会遇到一些问题,通常搞得莫名其妙,在版本选择上尽量选择最新的. 1.在5.03以前版本中,存储varchar型数据时,后面的空格会被忽视掉,前面的空格会保 ...
- mysql下sql语句 update 字段=字段+字符串
mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgr ...
- Oracle、MySql、Sql Server比对
1. 价格 MySql:廉价(部分免费):当前,MySQL採用双重授权(DualLicensed),他们是GPL和MySQLAB制定的商业许可协议.假设你在一个遵循GPL的自由(开源)项目中使用 ...
随机推荐
- Codefroces B. New Skateboard
B. New Skateboard time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- 给网站设置ICO图标
方法一: 直接在站点根目录下放入名为:favicon.ico 的图标文件(必须要为 ICO 文件,BMP 及其他格式的图片文件不行).还有将 favicon.ico 中的 favico ...
- NewtonSoft对象转json时,把 NULL 转 "" , 过滤 NULL, DateTime 时间类型去除 T
IsoDateTimeConverter timeConverter = new IsoDateTimeConverter(); timeConverter.DateTimeFormat = &quo ...
- sessionStorage的使用方法
本篇是关于sessionStorage的使用方法的介绍,简单几行代码,实现sessionStorage,请大家查阅 (1)在需要设置sessionStorage的页面写如下代码可以存入sessionS ...
- django模型系统二
常用查询及表关系的实现 1.常用查询 每一个django模型类,都有一个默认的管理器 objects QuerySet表示数据库中对象的列表,它可以有0到多个过滤器.过滤器通过给定参数,缩小查询范围. ...
- Css学习总结(1)——20个很有用的CSS技巧
1. 黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate { filter: grayscale(100%); -webkit-filter: graysca ...
- 洛谷——T1725 探险
http://codevs.cn/problem/1725/ 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- NO.1 You must restart adb and Eclipse多种情形分析与解决方式
一:错误提示 The connection to adb is down, and a severe error has occured. You must restart adb and Eclip ...
- hdu 1003 Max Sum 最大字段和 dp
今天看了一上午dp.看不太懂啊.dp确实不简单.今天開始学习dp,搜了杭电的dp46道,慢慢来吧.白书上的写的 又不太具体,先写几道题目再说. .. 题目连接:id=516&page=1&qu ...
- js21---单体(单例)模式
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...