最近碰到了sql_mode 的一些问题,故进行了研究,根据实际情况研究其行为。

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

上述7个默认行为是mysql5.7.8+的

参考官方文档进行理解:

第一个:NO_ENGINE_SUBSTITUTION, 可以简单理解为 默认开启控制引擎行为的参数 

Control automatic substitution of the default storage engine when a statement
such as CREATE TABLE or ALTER TABLE specifies a storage engine that is disabled or not compiled in.
By default, NO_ENGINE_SUBSTITUTION is enabled.
Because storage engines can be pluggable at runtime, unavailable engines are treated the same way:
With NO_ENGINE_SUBSTITUTION disabled, for CREATE TABLE the default engine is used and a warning occurs if the desired engine is unavailable.
For ALTER TABLE, a warning occurs and the table is not altered.
With NO_ENGINE_SUBSTITUTION enabled, an error occurs and the table is not created or altered if the desired engine is unavailable.

结论1: 在sql_mode中包涵no_engine_subtitution 且create table 中engine子句指定的存储引擎不被支持时,mysql会报错,而且不会执行语句成功

结论2:在sql_mode中不包涵no_engine_subtitution 且create table 中engine子句指定的存储引擎不被支持时,mysql会把表的引擎改为innodb。

第二个:ONLY_FULL_GROUP_BY 与sql 聚合写法有关系。

今天遇到了这个问题,记录下。

mysql5.7报错如下:

官方文档的说法:

不兼容的更改:在MySQL 5.7.5中,进行了以下SQL模式更改:

  • ONLY_FULL_GROUP_BY SQL模式的 实现 变得更加复杂,不再拒绝先前被拒绝的确定性查询。因此,ONLY_FULL_GROUP_BY 现在默认情况下启用,以禁止包含不保证在组内唯一确定的表达式的非确定性查询。

  • 到默认的SQL模式导致违约的变化sql_mode 与这些模式的系统变量值启用: ONLY_FULL_GROUP_BY

  • 该 ONLY_FULL_GROUP_BY 模式现在也包含在ANSISQL模式所包含的模式中。

如果您发现已 ONLY_FULL_GROUP_BY 启用导致对现有应用程序的查询被拒绝,则这些操作之一应该还原操作:

  • 如果可以修改有问题的查询,请执行此操作,以便非确定性非聚合列在功能上依赖于GROUP BY列,或者通过引用非聚合列使用 ANY_VALUE()

  • 如果无法修改有问题的查询(例如,如果它是由第三方应用程序生成),请sql_mode 在服务器启动时将系统变量设置为不启用 ONLY_FULL_GROUP_BY

马上做个试验复现,然后再做总结:


总结:mysql 的group by 语句,5.7之前并没有完美匹配 ANSI的sql语法模式,而且非聚合列不一定需要出现在group by 语句之后,因为语法要求的不严格,导致开发过程中出现

此类问题,而5.7之后,严格的模式是分组聚合的正确选择。

MYSQL 5.7 sqlmode 行为的更多相关文章

  1. 请在mysql配置文件修sql-mode或sql_mode为NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    错误信息:请在mysql配置文件修sql-mode或sql_mode为NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 解决办法(最有效,以MySQL5.7为例): ...

  2. mysql 大小写问题-sql-mode问题

    一.mysql 字段名 表名 数据库名 是否区分大小写 今天碰到数据库大小写问题,linux与windows下问题 同时又碰到保留字 http://www.cnblogs.com/lawdong/ar ...

  3. mysql中的sql-mode导致的datetime类型字段不能为0000

    问题描述: 在执行建表语句的时候,出现invalid default datetime value '0000-00-00 00:00:00',从字面意思看,就是不合法的默认值'0000-00-00 ...

  4. mysql下的sqlmode详解

    转自:https://www.cnblogs.com/Zender/p/8270833.html 阅读目录 一,sql_mode值的含义 二,ANSI模式 三,STRICT_TRANS_TABLES模 ...

  5. Mysql SQL Mode详解

    Mysql SQL Mode简介 MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式.这样,应用程序就能对服务器操作进行量身定制以满足自己的需求.这类模式定义了 ...

  6. thinkphp无法安装提示修改mysql配置

    在安装以thinkphp为框架的系统时数据库连接错误,提示修改sql-mode或sql_mode为NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION.那我们就顺着提示 ...

  7. MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  8. MySQL/MariaDB数据库的服务器配置

    MySQL/MariaDB数据库的服务器配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL中的系统数据库 1>.mysql数据库 是mysql的核心数据库,类 ...

  9. Mysql SQL Mode简介

    MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式.这样,应用程序就能对服务器操作进行量身定制以满足自己的需求.这类模式定义了MySQL应支持的SQL语法,以及 ...

随机推荐

  1. Okhttp3上传多张图片同时传递参数

    之前上传图片都是直接将图片转化为io流传给服务器,没有用框架传图片. 最近做项目,打算换个方法上传图片. Android发展到现在,Okhttp显得越来越重要,所以,这次我选择用Okhttp上传图片. ...

  2. APP 渠道推广【摘自网络】

    渠道的合作方式无非三种,一种是付费合作,那很简单,谈好价格付钱.第二种是免费,主要是就是首发,还有就是跟渠道的运营小伙伴搞好关系让帮忙给个免费的位置等,第三种是活动奖品合作,简而言之,就是渠道商会逢年 ...

  3. sql 递归树

    with CTE as ( -->Begin 一个定位点成员 select ID, PersonName,ParentID,cast(PersonName as nvarchar(max)) a ...

  4. 快速搭建gulp项目实战

    gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码,而且大 ...

  5. jvm间歇性崩溃分析

    http://www.cnblogs.com/LBSer/p/4417148.html 1 问题描述 某服务有两台机器,每隔几天会报警load高,一开始看监控发现gc时间抖动很大,以为是发生了full ...

  6. Nodejs学习笔记(十七)—浮点运算decimal.js

    前言 开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰 JavaScript 只有一种数字类型 ( Number ) JavaScript采用 IEEE 754 标准双 ...

  7. 任务三十八:UI组件之排序表格

    任务三十八:UI组件之排序表格 面向人群: 有一定JavaScript基础 难度: 低 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质 ...

  8. Golang cron 定时任务使用

    1.cron 表达式的基本格式 用过 linux 的应该对 cron 有所了解.linux 中可以通过 crontab -e 来配置定时任务.不过,linux 中的 cron 只能精确到分钟.而我们这 ...

  9. awk去重以某列重复的行

    [root@localhost cc]# cat 2.txt adc 3 5 a d aa 3 adfa d ba 3 adf 去重第一列重复的行: [root@localhost cc]# cat ...

  10. SQL运算符

    SQL运算符实例代码教程 - 运算符是一个保留字或字符,主要用于在SQL语句的WHERE子句来执行,比较和算术运算等操作.  http://www.yiibai.com/sql/sql_operato ...