MySQL sql_mode的使用详解

sql_mode是一个非常关键的配置,接下来就带来该配置项的详细解析。

Posted in MySQL onMay 08, 2021

sql_mode详解

sql_mode,会直接影响SQL语法支持和数据校验,它包含非常多的选项,其中5.7版本的默认值是

“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”

,一般不建议进行修改。

最重要的选项

sql_mode最重要的选项,包括以下3个:

(1)ANSI:该选项决定SQL语法支持,设置为ANSI,会更加遵守标准SQL语法。

(2)STRICT_TRANS_TABLES:该选项决定数据校验;对于事务性存储引擎,当出现非法值时,该事务会失败并回滚;对于非事务性存储引擎,如果非法值出现在第一行,那么该事务会失败,如果非法值出现在中间,那么会调整非法值,并抛出告警。

(3)TRADITIONAL:该选项决定与传统关系型数据库表现一致;对于一些非正常操作,直接报错失败而不是告警提示。

全部选项

sql_mode还包括以下选项:

(4)ALLOW_INVALID_DATES:该选项决定不进行严格的日期校验;它只校验月份范围是否为1-12、日期范围是否为1-31,不校验具体日期是否有效,比如2020-04-31这个非法日期是允许的。

(5)ANSI_QUOTES:该选项决定引用字符;它允许双引号"作为引用字符,和反引号`一样。

(6)ERROR_FOR_DIVISION_BY_ZERO:该选项决定被零整除的返回值;如果不启用,那么被零整除的返回值为null且不告警;如果启用但在非严格模式下,那么被零整除的返回值为null且产生告警;如果启用且在严格模式下,那么被零整除会直接报错。

(7)HIGH_NOT_PRECEDENCE:该选项决定not操作的优先级;启用后,NOT a BETWEEN b AND c被解析为NOT (a BETWEEN b AND c);在一些旧版本中,NOT a BETWEEN b AND c被解析为(NOT a) BETWEEN b AND c。

(8)IGNORE_SPACE:该选项决定忽略函数名和括号之间的空格;启用后,比如count (*)也不会报错。

(9)NO_AUTO_CREATE_USER:该选项决定grant语句不会自动创建用户;已过时,grant语句也不会创建用户。

(10)NO_AUTO_VALUE_ON_ZERO:该选项决定自增列的生成;一般来说,向自增列插入0或null,系统会自动生成下一个自增值插入;启用后,向自增列插入0会保留原值0,插入null才会自动生成下一个自增值插入

(11)NO_BACKSLASH_ESCAPES:该选项决定反斜杠\的作用;启用后,反斜杠\不再作为转义字符,而是用作普通字符。

(12)NO_DIR_IN_CREATE:该选项决定忽略创建表时,所有的INDEX DIRECTORY和DATA DIRECTORY指令;该选项只在从库生效。

(13)NO_ENGINE_SUBSTITUTION:该选项决定创建表时,如果指定一个不存在/不支持的存储引擎,那么会自动转换为默认存储引擎。

(14)NO_FIELD_OPTIONS:已过时。

(15)NO_KEY_OPTIONS:已过时。

(16)NO_TABLE_OPTIONS:已过时。

(17)NO_UNSIGNED_SUBTRACTION:一般情况下,整数之间的减法(其中一个为无符号),结果为无符号,如果结果为负数则报错;启用该选项后,负数则可以正常处理。

(18)NO_ZERO_DATE:该选项决定‘0000-00-00'是否可以插入;如果不启用,那么‘0000-00-00'可以插入且不告警;如果启用但在非严格模式下,那么‘0000-00-00'可以插入但会产生告警;如果启用且在非严格模式下,那么‘0000-00-00'不能插入会直接报错。

(19)NO_ZERO_IN_DATE:该选项决定月份和日期是否可以为00;如果不启用,那么月份和日期可以为00且不告警;如果启用但在非严格模式下,那么月份和日期可以为00但会产生告警;如果启用且在非严格模式下,那么月份和日期不能为00会直接报错。

(20)ONLY_FULL_GROUP_BY:该选项决定select/having/order by后面的非聚合字段,必须出现在group by字句中。

(21)PAD_CHAR_TO_FULL_LENGTH:一般情况下,查询char类型的字段,后面的空洞数据会被裁剪;启用该选项后,查询char类型的字段,后面的空洞数据不会被裁剪。

(22)PIPES_AS_CONCAT:该选项决定将||符号当作字符串的连接操作符,而不是当作OR同义词。

(23)REAL_AS_FLOAT:该选项决定将REAL当作FLOAT同义词,而不是DOUBLE同义词。

(24)STRICT_ALL_TABLES:该选项决定数据校验;对于事务性存储引擎,当出现非法值时,该事务会失败并回滚;对于非事务性存储引擎,如果非法值出现在第一行,那么该事务会失败,如果非法值出现在中间,那么前面操作会成功、后面操作会直接报错,出现事务部分成功部分失败的情况。

总结

通过上面的学习,相信大家对sql_mode各选项,都有较为详细的了解;关于sql_mode如何设置,个人建议如下:

(1)对于5.5/5.6版本,sql_mode建议参照5.7默认值进行设置;

(2)对于5.7版本,sql_mode保持默认值即可;

(3)对于8.0版本,sql_mode也保持默认值即可。

sql_mode的设置,可以让MySQL非常灵活地运行在各种不同模式下,但与此同时也带来各种各样的风险;在MySQL广泛应用于各类重要系统的情况下,建议是要对sql_mode进行严格审核设置,同时对开发代码进行规范化管理;其实这一点,也可以从官方默认值看出来,随着MySQL版本的迭代,sql_mode的设置也是越来越严格。

以上就是MySQL sql_mode的使用详解的详细内容,更多关于MySQL sql_mode的使用的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
MySQL的join buffer原理
Apr 29 MySQL
MySQL 使用自定义变量进行查询优化
May 14 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
MySQL数据库压缩版本安装与配置详细教程
May 21 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
MySQL笔记 —SQL运算符
Jan 18 MySQL
一次SQL如何查重及去重的实战记录
Mar 13 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
MySQL 数据丢失排查案例
May 08 #MySQL
MySQL update set 和 and的区别
May 08 #MySQL
MySQL查询学习之基础查询操作
May 08 #MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 #MySQL
一篇文章弄懂MySQL查询语句的执行过程
详解MySQL主从复制及读写分离
MySQL 表空间碎片的概念及相关问题解决
You might like
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
Yii全局函数用法示例
2017/01/22 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
2018/12/11 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
2014年社区庆元旦活动方案
2014/03/08 职场文书
名人演讲稿范文
2014/09/16 职场文书
高中开学感言
2015/08/01 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python