[TOC]
sql_mode 设置为任意一种,就被成为严格模式。
1. 严格模式
- STRICT_TRANS_TABLES
- STRICT_ALL_TABLES
2. SQL 语句
先创建两张测试用的表:
create table test( id int(11) not null, col1 int(11) default null , primary key(id)) engine=Innodb default charset=utf8mb4;
create table test1( id int(11) not null, col1 int(11) default null , primary key(id)) engine=Myisam default charset=utf8mb4;
表结构查看:
mysql> show create table test\G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`id` int(11) NOT NULL,
`col1` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
mysql> show create table test1\G ·e
*************************** 1. row ***************************
Table: test1
Create Table: CREATE TABLE `test1` (
`id` int(11) NOT NULL,
`col1` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
设置严格模式:
SET sql_mode='STRICT_TRANS_TABLES' 或者 SET sql_mod='STRICT_ALL_TABLES'
3. 区别☆
结果见图
在不设置严格模式下,无论是 Innodb还是 Myisam都会在插入'a'到 int 类型的col1 字段时,不会报错且将'a'转换为 数字0。
-
innodb 引擎:
a. 在执行 insert 操作时,只要设置了严格模式任一种。无论插入单行还是多行,只要插入数据与字段类型不兼容,则 insert 操作失败并回滚。
-
myisam 引擎:
STRICT_TRANS_TABLES:
不管是插入单行还是多行,如果某一行数据字段类型不匹配,则插入失败。否则成功。
STRICT_ALL_TABLES
1. 如果首条数据可以插入成功,则后面数据会将字符串'a'转换为 0 继续插入 2. 如果首条数据插入失败,则后续数据都无法插入。