《MySQL》第十一篇 SQL_MODEL模式简述

目录

    • 一. 介绍与使用
    • 二. 模式类型
    • 三. 常用模式演示
      • ANSI 模式
      • TRADITIONAL 模式
      • STRICT_TRANS_TABLES 模式

一. 介绍与使用

SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL
常用来解决下面几类问题:

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

二. 模式类型

可用下面的语句查询当前MySQL的SQL_MODEL设置的信息

## 查询Mysql定义的sql_model类型
select @@sql_model;

《MySQL》第十一篇 SQL_MODEL模式简述_第1张图片

模式 说明
ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中
NO_ZERO_IN_DATE 在严格模式下,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告
NO_ZERO_DATE 在严格模式下,不要将 '0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告
ERROR_FOR_DIVISION_BY_ZERO 在严格模式下,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL
NO_AUTO_CREATE_USER 防止GRANT自动创建新用户,除非还指定了密码
NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
ANSI 宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告
TRADITIONAL 严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚
STRICT_TRANS_TABLES 严格模式,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制;在该模式下会进行数据的严格校验,错误数据不能插入,报error错误

三. 常用模式演示

## 创建表
CREATE TABLE `study`.`test`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(7) NULL,
  PRIMARY KEY (`id`)
) ENGINE = InnoDB;

ANSI 模式

宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告

##设置sql_model为ANSI模式
SET sql_mode='ANSI';
insert into test(name) VALUES('利昂内尔·安德烈斯·梅西·库奇蒂尼'); 
show warnings;
select * from test;

执行上诉SQL语句,提示”Data truncated for column ‘name’ at row 1“错误信息
《MySQL》第十一篇 SQL_MODEL模式简述_第2张图片
查询结果发现,虽然有错误信息提示,但是数据插入成功了,并且插入的数据与原本需要插入的数据不一致,
MySQL根据字段name设置的长度,按照max length 截取数据存储
《MySQL》第十一篇 SQL_MODEL模式简述_第3张图片

TRADITIONAL 模式

严格模式,当向MySQL数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚

##设置sql_model为TRADITIONAL模式
SET sql_mode='TRADITIONAL';
insert into test(name) VALUES('克里斯蒂亚诺·罗纳尔多'); 
show warnings;
select * from test;

执行上述SQL语句,提示”Data too long for column ‘name’ at row 1“错误信息,明确表示插入的信息超过name设置最长长度7,数据不会插入成功
《MySQL》第十一篇 SQL_MODEL模式简述_第4张图片

STRICT_TRANS_TABLES 模式

严格模式,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制;在该模式下会进行数据的严格校验,错误数据不能插入,报error错误

##设置sql_model为STRICT_TRANS_TABLES 模式
SET sql_mode='STRICT_TRANS_TABLES ';
insert into test(name) VALUES('内马尔·达·席尔瓦·儒尼奥尔'); 
show warnings;

与TRADITIONAL 模式类似,执行上述SQL,直接提示”Data too long for column ‘name’ at row 1“错误信息,明确表示插入的信息超过name设置最长长度7,数据不会插入成功
《MySQL》第十一篇 SQL_MODEL模式简述_第5张图片

你可能感兴趣的:(#,MySQL,mysql,sql,oracle)