目录
- 一. 介绍与使用
- 二. 模式类型
- 三. 常用模式演示
- ANSI 模式
- TRADITIONAL 模式
- STRICT_TRANS_TABLES 模式
一. 介绍与使用
SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL
常用来解决下面几类问题:
- 通过设置SQL Mode,可以完成不同严格程度的数据校验,有效地保障数据准确性。
- 通过设置SQL Mode为ANSI模式,来保证大多数SQL符合标准的SQL语法,这样应用在不同数据库之间进行迁移时,就不需要对业务SQL进行较大的修改。
- 在不同数据库之间进行迁移之前,通过设置SQL Mode可以使MySQL上的数据更方便地迁移到目标数据库中。
二. 模式类型
可用下面的语句查询当前MySQL的SQL_MODEL设置的信息
## 查询Mysql定义的sql_model类型
select @@sql_model;
模式 | 说明 |
---|---|
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根据字段name设置的长度,按照max length 截取数据存储
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,数据不会插入成功
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,数据不会插入成功