一.概述
与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql。
sql model 常用来解决下面几类问题:
(1) 通过设置sql mode, 可以完成不同严格程度的数据校验,有效地保障数据准备性。
(2) 通过设置sql model 为ansi 模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据库之间进行迁移时,则不需要对业务sql 进行较大的修改。
(3) 在不同数据库之间进行数据迁移之前,通过设置SQL Mode 可以使MySQL 上的数据更方便地迁移到目标数据库中。
1. 演示sql model 严格模式
从mysql 5.7 开始, 默认是严格模式, mysql 开始严格遵从SQL 92规范。通过strict_trans_tables严格模式实现了数据的严格校验。 使错误数据不能插入表中, 从而保证了数据的准确性。
-- 查看sql model 模式SELECT @@sql_mode;
-- 下面可将sql model设置为严格模式 set session sql_mode='STRICT_TRANS_TABLES';
-- 新建表设置address为10个长度 CREATE TABLE test_sqlmode (address VARCHAR(10) ) -- 插入超过长度 INSERT INTO test_sqlmode VALUES('123456789123');
通过下图可以看出, 严格模式下超出数据 插入将报错。 如果不是严格模式,则会报warning 警告 并截取字符。
2. sql mode 组合模式
组合模式类似于角色和权限的关系。这样当实际应用时,只需要设置一个模式组合,就可以设置很多的原子模式,大大方便了用户的工作。
ANSI模式 | 宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。 等同于REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE 和ANSI 组合模式 |
traditional 模式 | 严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事务时,会进行事务的回滚。 TRADITIONAL 模式等同于STRICT_TRANS_TABLES、STRICT_ALL_TABLES、 NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、TRADITIONAL 和NO_AUTO_CREATE_USER 组合模式 |
STRICT_TRANS_TABLES模式 | 严格模式,进行数据的严格校验,错误数据不能插入,报error错误。 例如:不允许非法日期,也不允许超过字段长度的值插入字段中,对于插入不正确的值给出错误而不是警告 |
二. sql model 迁移如何使用
如果mysql 与其它异构数据库之间有数据迁移的需求时,那么mysql中提供的数据库组合模式则会对数据迁移过程会有所帮助。对导出数据更容易导入目标。
在数据迁移过程中,可以设置SQL Mode 为NO_TABLE_OPTIONS 模式,这样将去掉show create table 中的“engine”关键字,获得通用的建表脚本。
-- 查看表有 engine 引擎 SHOW CREATE TABLE test_sqlmode;
-- 将所有表去掉engine 引擎。变为通用表 -- 修改 当前会话下的sql model SET SESSION sql_mode='NO_TABLE_OPTIONS'