MySQL的三种常见sql_mode

MySQL数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!

我们可以通过以下方式查看当前数据库使用的sql_mode:

mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

以及:

mysql> show variables like 'sql_mode%'\G
*************************** 1. row ***************************
Variable_name: sql_mode
        Value: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
1 row in set (0.03 sec)

MySQL5.0以上常见的三种sql_mode,即:

  1. ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
  2. TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。
  3. STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。

sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。

在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。

一般的,我们可以在MySQL服务中直接修改:

set @@sql_mode=STRICT_TRANS_TABLES;
Query OK, 0 rows affected (0.00 sec)

但这样只是在内存中生效,系统重启后失效,如果想要永久生效可以直接在my.cnf文件中这样配置:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

注:
MySQL5.6.6 以后版本默认就是NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

标签: MySQL

添加新评论