MySQL 学习笔记

MySQL是一个开源的关系型数据库,非常流行。

如无特殊说明,本专题文章的 SQL 均在 5.6 版本中验证。

👉文章列表
MySQL 学习笔记 ⏬ 创建和删除数据库 切换和查看数据库 创建和删除表 在表中增加、删除、修改列 添加和删除索引 增删查改 创建和删除主键 大小写和反引号 字符串类型值的大小写 SQL注释 CHAR类型 VARCHAR类型 整型数字 时间戳 不要使用utf8 唯一索引与NULL 唯一索引的单列长度限制 NULL的判等 DDL、DML、DCL的含义 查看表的状态 show table status InnoDB存储引擎的限制 if和case的使用 自定义函数 InnoDB 索引 事务 事务隔离级别的概念、查看和修改 读已提交(read committed)隔离级别下的锁 可重复读(repeatable read)隔离级别下的锁 修改自增主键id的类型 使用 load data 快速导入数据 使用 select into outfile 导出数据

MySQL: 严格模式


严格模式官方文档

设置严格模式

为当前会话设置严格模式:

执行SET sql_mode = 'STRICT_TRANS_TABLES' 或者SET sql_mode = 'STRICT_ALL_TABLES'

全局设置严格模式:

执行SET global sql_mode = 'STRICT_TRANS_TABLES' 或者SET global sql_mode = 'STRICT_ALL_TABLES'

或者在 MySQL 配置文件中配置以下内容,再重启:

[mysqld]
sql_mode = 'STRICT_TRANS_TABLES'  ; 或者配置成 STRICT_ALL_TABLES

设置非严格模式:SET sql_mode=''

查询当前的 SQL 模式

SHOW VARIABLES LIKE 'sql_mode';
SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE;

STRICT_TRANS_TABLES 和 STRICT_ALL_TABLES 的区别

唯一的区别是: 对于不支持事务的表,若开启 STRICT_TRANS_TABLES,MySQL 会尝试将一个不合法的字段值转换成一个值最近的合法值插入表中;而开启 STRICT_ALL_TABLES 后,则表现为不写入数据,且抛出错误。

因为现在绝大部分用的 InnoDB 引擎,是支持事务的,所以基本不用关心这种区别。

严格模式和非严格模式的区别

严格模式下不能在无符号整数字段插入负值

MySQL: 无符号整数列插入负数会发生什么?

严格模式下,无默认值的 not null 字段在插入数据时必须指定值

MySQL: NOT NULL 字段不插入数据,会发生什么?

严格模式下,插入字符串不能超出定义长度

对于下表:

CREATE TABLE `test_table` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` char(4),
  PRIMARY KEY(`id`)
) ENGINE=InnoDB CHARSET=utf8mb4;

在非严格模式下执行

INSERT INTO `test_table` (name) VALUES('12345');

会成功插入数据,但是内容被截断,只剩4个字符:

mysql> select * from test_table;
+----+------+
| id | name |
+----+------+
| 1  | 1234 |
+----+------+

但是严格模式下会报错:

(1406, u"Data too long for column 'name' at row 1")

( 本文完 )

文章目录