SQL Mode
SQL Mode简介
在MySQL中,SQL Mode常常用来解决以下问题:
1.通过设置SQL Mode,可以完成不同严格程度的数据校验,有效保证数据准确性。
2.通过设置SQL Mode为ANSI模式,来保证大多数SQL是符合标准的SQL语法,这样应用在不同数据库之间迁移时,则不需要对业务SQL进行较大修改。
3.在不同数据库进行数据迁移时,通过设置SQL Mode可以使得MySQL上的数据更方便迁移到目标数据库
在MySQL5.7.18上,查询默认的SQL Mode(@@sql_mode)为STRICT_TRANS_TABLES, NO_ENGINE_SUBSTITUTION
STRICT_TRANS_TABLES为严格模式,实现了数据的严格校验,对不符合数据类型的错误数据不能插入表中,保证了数据的准确性。
mysql> select @@sql_mode; # 严格模式
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
mysql> desc transaction;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | UNI | NULL | |
| account | double | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql>insert into transaction values(null, "123456789abcdefghijkkkkkkkkkkkkkkk", 2000);
ERROR 1406 (22001): Data too long for column 'name' at row 1
如果更改SQL Mode为ANSI模式,错误数据也会被插入表中, 对于超过长度的值,会进行截取。
mysql> set session sql_mode="ANSI"; #ANSI模式
Query OK, 0 rows affected (0.00 sec)
mysql> select @@sql_mode;
+--------------------------------------------------------------------------------+
| @@sql_mode |
+--------------------------------------------------------------------------------+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into transaction values(null,'1111111111111111222222222222223333333333333',2000);
Query OK, 1 row affected, 1 warning (0.10 sec)
mysql> select name from transaction where id=27; # 允许数据插入但多余长度被截断
+----------------------+
| name |
+----------------------+
| 11111111111111112222 |
+----------------------+
1 row in set (0.00 sec)
SQL Mode的常见功能
1 校验日期格式的合法性
例如:给定一个非法日期如“2019-2-31”进行插入操作
mysql> select @@sql_mode; # ANSI模式
+--------------------------------------------------------------------------------+
| @@sql_mode |
+--------------------------------------------------------------------------------+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> create table t1(d date);
Query OK, 0 rows affected (0.29 sec)
mysql> SET @invalidData='2017-2-31';
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t1 values(@invalidData);
Query OK, 1 row affected, 1 warning (0.07 sec)
mysql> select * from t1; # ANSI模式支持非法数据插入,插入值为“0000-00-00"
+------------+
| d |
+------------+
| 0000-00-00 |
+------------+
1 row in set (0.00 sec)
mysql> set session sql_mode="TRADITIONAL"; # 严格模式下报错
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> insert into t1 values(@invalidData);
ERROR 1292 (22007): Incorrect date value: '2017-2-31' for column 'd' at row 1
mysql>
2 在ANSI模式下执行MOD(x, 0)不会出错,插入时数值变为NULL。
3 启用NO_BACKSLASH_ESCAPES使得反斜杠成普通字符。
mysql> select @@sql_mode; #ANSI模式下,没有启用NO_BACKSLASH_ESCAPES
+--------------------------------------------------------------------------------+
| @@sql_mode |
+--------------------------------------------------------------------------------+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> set @escapeStr = '\\a\s\t\n123';
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t2 values(@escapeStr);
Query OK, 1 row affected (0.06 sec)
mysql> select * from t2; # 出现转义字符被执行
+----------+
| url |
+----------+
| \as
123 |
+----------+
1 row in set (0.00 sec)
mysql> set session sql_mode='ANSI,NO_BACKSLASH_ESCAPES';
Query OK, 0 rows affected (0.00 sec)
mysql> set @escapeStr = '\\begin';
Query OK, 0 rows affected (0.00 sec)
mysql> truncate table t2;
Query OK, 0 rows affected (0.20 sec)
mysql> insert into t2 values(@escapeStr);
Query OK, 1 row affected (0.04 sec)
mysql> select * from t2;
+---------+
| url |
+---------+
| \\begin |
+---------+
1 row in set (0.00 sec)
mysql>
4 启用PIPES_AS_CONTACT模式。将“||”视为字符串连接符号(同CONCAT)
mysql> select '1'||'2' as A, concat('3', '4') as B;
+----+----+
| A | B |
+----+----+
| 12 | 34 |
+----+----+
1 row in set (0.00 sec)
常见的SQL Mode
| sql_mode值 | 描述 |
|---|---|
| ANSI | 等同于REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI |
| STRICT_TRANS_TABLES | 适用于事务处理,对于非法数据直接抛出错误,而非warning |
| TRADITIONAL | 等同于STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION, 属于严格模式,对于非法数据直接抛出错误,可用在事务表中,出现错误立即回滚 |
SQL Mode在数据迁移中如何使用
MySQL提供了很多数据库的组合模式,例如“ORACLE、POSTGRESQL”等
其组合形式可参考https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html[https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html]: https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html。
SQL Mode的更多相关文章
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- Sql Server系列:分区表操作
1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- EntityFramework Core Raw SQL
前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...
- 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
随机推荐
- person类与其子类在使用中的内存情况(含java的改写和c#的屏蔽)
JAVA 普通person类及调用代码: public class Person { public String xm; public int nl; public void setme(String ...
- ffmpeg命令参数详解
ffmpeg命令参数详解 http://linux.51yip.com/search/ffmpeg ffmpeg图片加滤镜效果 参考:https://cloud.tencent.com/develop ...
- ES6的新特性
ECMAScript 6(简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,又称ECMAScript 2015.ES6就是ES2015. 虽然目前并不是所有 ...
- 英语hawkbillturtle玳瑁
玳瑁(hawkbillturtle):属爬行纲,海龟科的海洋动物.一般长约0.6米,大者可达1.6米.头顶有两对前额鳞,吻部侧扁,上颚前端钩曲呈鹰嘴状:前额鳞2对:背甲盾片呈覆瓦状排列:背面的角质板覆 ...
- 搜索和浏览离线 Wikipedia 维基百科(中/英)数据工具
为什么使用离线维基百科?一是因为最近英文维基百科被封,无法访问:二是不受网络限制,使用方便,缺点是不能及时更新,可能会有不影响阅读的乱码. 目前,主要有两种工具用来搜索和浏览离线维基百科数据:Kiwi ...
- selenium登录简单的网站
import time from selenium import webdriver from lxml import etree from selenium.webdriver import Act ...
- svn进行上传项目
当svn的服务器搭建成功后,就可以进行上传项目了. 右键,选择客户端的repo-browser, 输入地址 然后就可以浏览所有项目: 然后在版本仓库上,右键,add folder, 添加对应的文件夹即 ...
- 接口自动化--读取Excel操作(openpyxl)
上次我们已经将requests库封装成我们想要的样子了,我们的接口自动化已经完成了最开始的一步了,接下来我们需要完成我们相应的其他模块的封装,下面简单介绍下我们在接口自动化需要用到的模块吧在接口自动化 ...
- 线程的等待与唤醒,实现if...else里面的值交互依次输出
线程通信原理图: 资源类: package com.yonyou.sci.gateway.exec.threadnet; public class Resource { String name; St ...
- 关键字explicit的作用(转)
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...