sql_mode

[TOC]

sql_mode 设置为任意一种,就被成为严格模式。

1. 严格模式

  1. STRICT_TRANS_TABLES
  2. 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。

  1. innodb 引擎:

    a. 在执行 insert 操作时,只要设置了严格模式任一种。无论插入单行还是多行,只要插入数据与字段类型不兼容,则 insert 操作失败并回滚。

  2. myisam 引擎:

    STRICT_TRANS_TABLES:

     不管是插入单行还是多行,如果某一行数据字段类型不匹配,则插入失败。否则成功。
    

    STRICT_ALL_TABLES

    1. 如果首条数据可以插入成功,则后面数据会将字符串'a'转换为 0 继续插入
    2. 如果首条数据插入失败,则后续数据都无法插入。
    
image-20200920134119534.png

你可能感兴趣的:(sql_mode)