1. SQL Mode简介

通过SQL Mode 解决下面几个问题

  1. 可以完成不同严格程度的数据校验,有效地保障数据准确性
  2. 设置SQL Mode为ANSI模式,来保证大多数SQL符合标准的SQL语法,这样应用在不同数据库之间进行迁移时则不需要对业务SQL进行较大修改
  3. 在不同数据库之间进行数据库迁移之前,通过设置SQL Mode可以使MySQL上的数据更方便地迁移到目标数据库中

查看本机的sql_mode

  1. select @@sql_mode

image.png

设置本的sql_mode

set [SESSION|GlOBAL] sql_mode='modes';

SESSION: 代表只在本次连接中生效
GlOBAL :代表本次不生效,而对于新连接生效

案例:

将mode改为严格模式后 记录无法插入
image.png

2. SQL Mode的常见功能

2.1 TRADITIONAL模式- 校验日期合法性

image.png

时间严格模式
image.png

在insert和update中,如果SQL Mode 处于此模式,那么运行mod(x,0) 求余就会产生错误,而在ansi中能插入但是插入是null,因为TRADITIONAL也属于严格模式,在非严格模式返回null

2.2 NO_BACKSLASH_ESCAPES

使反斜线为普通字符。

image.png

image.png

2.3 PIPES_AS_CONCAT

将‘||’视为字符串连接操作符

ansi 模式包含了此模式
image.png

3. 常用的SQL Mode

3.1 ANSI组合

这种模式适用语法和行为 非常标准的sql
image.png

3.2 STRICT_TRANS_TABLES

适用于事务表和非事务表,它是严格模式,不允许非法日期,也不允许超过字符长度的值插入字段中,对于插入不正确的值给出错误而不是警告

3.3 TRADITIONAL

严格模式,对于插入不正确的值给出错误而不是警告。可以应用在事务表和非事务表,用在事务表时,只要出现错误就会立即回滚

image.png
image.png

4. SQL Mode 在迁移中如何使用

  1. 如果MySQL与其他异构数据库之间有数据迁移的需求,那么MySQL中提供的数据库组合模式,比如’ORACLE’,’DB2’、’PostgreSQL’等等,这些模块由很多小的sql_mode组成,在异构数据库之间迁移数据时候,可以尝试适用这些的模式来导出适合于目标数据库的数据,这样更好的导出
  2. 可以使用sql_mode 为’NO_TABLE_OPTIONS’ 这样可以去掉engine关键字,这样可以获得通用的建表脚本