Mysql SQL Mode问题简谈
- 1. Mysql SQL Mode简介
- 2. 常用的SQL Mode
- 3. SQL Mode在迁移中的应用
1. Mysql SQL Mode简介
SQL Mode定义了Mysql应支持的SQL语句、数据校验等,这样可以容易在不同的环境中使用Mysql。
- 通过设置SQL Mode,可以完成不同严格程度的数据校验,有效地保障数据准确性。
- 通过设置SQL Mode为ANSI模式,来保证大多数SQL符合标准SQL语句,这样应用在不同数据库之间进行迁移时,则不需要对业务SQL进行较大的修改。
- 在不同数据库之间进行数据迁移之前,通过设置SQL Mode可以使Mysql上的数据更方便地迁移到目标数据库中。
2. 常用的SQL Mode
- ANSI模式:等同于REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE和ANSI组合模式,这种模式使语法和行为更加符合标准的SQL。
- STRICT_TRANS_TABLES:适用于事务表和非事务表,它是严格模式,不允许非法日期,也不允许超过字段长度的值插入字段中,对于插入不正确的值给出错误而不是警告。
- TRADITIONAL:等同于STRICT_TRANS_TABLES、STRICT_TALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、TRADITIONAL和NO_AUTO_CREATE_USER组合模式,所以它也是严格模式,对于插入不正确的值是给出错误而不是警告,可以应用在事务表和非事务表,用在事务表,只要出现错误就会立即回滚。
可以发现,SQL Mode其实都是一些原子操作的组合,类似于角色和权限的关系。这样当实际应用时,只需要设置一个模式组合,就可以设置很多的原子模式,大大便利了用户工作。
3. SQL Mode在迁移中的应用
目标数据库 | 组合模式中的各个sql mode |
---|---|
DB2 | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS |
MSSQL | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS |
ORACLE | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER |
POSTGRESQL | PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER |
数据迁移过程中,可以设置SQL Mode为NO_TABLE_OPTIONS模式,这样将去掉show create table中的"engine"关键字,获得通用的建表脚本。
set session sql_mode=‘NO_TABLE_OPTIONS’;