MySQL的SQL_MODE模式

1. sql_mode模式
mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode:

  1. mysql> select @@sql_mode;
  2. +----------------------------------------------------------------+
  3. | @@sql_mode                                                     |
  4. +----------------------------------------------------------------+
  5. | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
  6. +----------------------------------------------------------------+

或者通过查看系统变量方式:

  1. mysql> show variables like ‘sql_mode%‘\G;
  2. *************************** 1. row ***************************
  3. Variable_name: sql_mode
  4. Value: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

mysql5.0以上版本支持三种sql_mode模式:

  ANSI

  TRADITIONAL

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

1.2 ANSI模式

  1. mysql> set @@sql_mode=ANSI;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> create table test(name varchar(4), pass varchar(4));
  4. Query OK, 0 rows affected (0.03 sec)
  5. mysql> insert into test values(‘aaaaa‘,‘aaaaa‘),(‘bbbb‘,‘bbbb‘);
  6. Query OK, 2 rows affected, 2 warnings (0.02 sec)
  7. Records: 2  Duplicates: 0  Warnings: 2
  8. mysql> show warnings;
  9. +---------+------+-------------------------------------------+
  10. | Level   | Code | Message                                   |
  11. +---------+------+-------------------------------------------+
  12. | Warning | 1265 | Data truncated for column ‘name‘ at row 1 |
  13. | Warning | 1265 | Data truncated for column ‘pass‘ at row 1 |
  14. +---------+------+-------------------------------------------+
  15. 2 rows in set (0.00 sec)
  16. mysql> select * from test;
  17. +------+------+
  18. | name | pass |
  19. +------+------+
  20. | aaaa | aaaa |
  21. | bbbb | bbbb |
  22. +------+------+
  23. 2 rows in set (0.00 sec)

我们可以看到,在ANSI模式下,当我们插入数据时,未满足列长度要求时,数据同样会插入成功,但是对超出列长度的字段进行截断,同时报告warning警告。

1.3 STRICT_TRANS_TABLES模式

  1. mysql> set @@sql_mode=STRICT_TRANS_TABLES;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> create table test(name varchar(4), pass varchar(4));
  4. Query OK, 0 rows affected (0.02 sec)
  5. mysql> insert into test values(‘aaaaa‘,‘aaaaa‘),(‘bbbb‘,‘bbbb‘);
  6. ERROR 1406 (22001): Data too long for column ‘name‘ at row 1
  7. mysql> show errors;
  8. +-------+------+------------------------------------------+
  9. | Level | Code | Message                                  |
  10. +-------+------+------------------------------------------+
  11. | Error | 1406 | Data too long for column ‘name‘ at row 1 |
  12. +-------+------+------------------------------------------+
  13. 1 row in set (0.00 sec)
  14. mysql> select * from test;
  15. Empty set (0.00 sec)

我们可以看到,在STRICT_TRANS_TABLES模式下,当我们插入数据时,mysql会严格的进行数据的校验,当发现插入列值未满足要求,直接报告error错误,保证了错误数据无法插入到数据库中。

1.3 TRADITIONAL模式

  1. mysql> set @@sql_mode=TRADITIONAL;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> create table test(name varchar(4), pass varchar(4));
  4. Query OK, 0 rows affected (0.02 sec)
  5. mysql> insert into test values(‘aaaaa‘,‘aaaaa‘),(‘bbbb‘,‘bbbb‘);
  6. ERROR 1406 (22001): Data too long for column ‘name‘ at row 1
  7. mysql> show errors;
  8. +-------+------+------------------------------------------+
  9. | Level | Code | Message                                  |
  10. +-------+------+------------------------------------------+
  11. | Error | 1406 | Data too long for column ‘name‘ at row 1 |
  12. +-------+------+------------------------------------------+
  13. 1 row in set (0.00 sec)
  14. mysql> select * from test;
  15. Empty set (0.00 sec)

TRADITIONAL模式与STRICT_TRANS_TABLES模式执行的结果,在这种情况下一致。

  1. mysql> select @@sql_mode\G;
  2. *************************** 1. row ***************************
  3. @@sql_mode: STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,E
  4. RROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER
  5. 1 row in set (0.00 sec)

看一下TRADITIONAL模式,我们发现在TRADITIONAL模式下,对所有的事务存储引擎,非事务存储引擎检查,日期类型中的月和日部分不能包含0,不能有0这样的日期(0000-00-00),数据不能除0,禁止grant自动创建新用户等一些校验。

注意:我们这里设置的sql_mode都是session级别的。另外,可以直接修改my.ini文件,找到sql_mode,然后设置新的模式即可!

例如:

MySQL5.0\MySQL Server 5.0\my.ini

在[mysqld]下面添加如下列:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

为支持原创,特写明转载地址:

http://blog.csdn.net/wulantian/article/details/8905573

时间: 2024-10-16 17:43:36

MySQL的SQL_MODE模式的相关文章

MySQL的sql_mode模式说明及设置

MySQL的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题. sql model 常用来解决下面几类问题 (1) 通过设置sql mode, 可以完成不同严格程度的数据校验,有效地保障数据准备性. (2) 通过设置sql model 为宽松模式,来保证大多数sql符合标准的sql语法,这样

Mysql的SQL模式

Mysql在5.6版本以后默认的SQL模式是STRICT_TRANS_TABLES,对数据的严谨性和一致性上比之前版本要有所提升. 一.查看当前sql模式 mysql> select @@sql_mode; +--------------------------------------------+ | @@sql_mode | +--------------------------------------------+ | STRICT_TRANS_TABLES,NO_ENGINE_SUBST

mysql SQL服务器模式

MySQL服务器可以以不同的SQL模式来操作,并且可以为不同客户端应用不同模式.这样每个应用程序可以根据自己的需求来定制服务器的操作模式. 模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查.这样可以更容易地在不同的环境中使用MySQL,并结合其它数据库服务器使用MySQL. 你可以用--sql-mode="modes"选项启动mysqld来设置默认SQL模式.如果你想要重设,该值还可以为空(--sql-mode =""). 你还可以在启动后用SET

mysql的sql_mode合理设置

MySQL的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题   sql_mode常用值如下: ONLY_FULL_GROUP_BY: 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中 NO_AU

MySQL的sql_mode解析与设置

https://blog.csdn.net/hhq163/article/details/54140286 https://blog.csdn.net/ccccalculator/article/details/70432123 升级mysql后,居然使用错误.更新时候提示timestamp类型错误,提示无默认值错误 原来是mysql提升了安全措施,原来的0000-00-00不被允许了,默认值也必须收购设置了 需要更改一下,但尚未找到快速更改的方法,只好先更改mysql设置了: 一.查看 sql

mysql5.6.20数据库sql_mode模式设置

开发需求要求通过php后台程序导入数据到mysql的某个库的表中,但是报错:Incorrect integer value: '' for column 'id' at row 1.同时自己在mysql5.6的数据库的这个表中insert into 一条数据,insert into log values('','admin','31','002t'),还是报错出现上面同样的错误. 于是网上百度找到解决办法: 参考资料:http://blog.csdn.net/j2eelamp/article/d

通过KeepAlived搭建MySQL双主模式的高可用集群系统

企业级MySQL集群具备高可用.可扩展.易管理.低成本的特点.下面将介绍企业环境中经常应用的一个解决方案,即MySQL的双主互备架构,主要设计思路是通过MySQL Replication技术将两台MySQL Server互相将对方作为自己的Master,自己又同时作为对方的Slave来进行复制.这样就实现了高可用构架中的数据同步功能,同时,将采用KeepAlived来实现Mysql的自动failover.在这个构架中,虽然两台MySQL Server互为主从,但同一时刻只有一个MySQL Ser

saltstack学习-2 :returnner-将结果发送给syslog和mysql(单边模式)

一,returnner介绍 1,默认情况下,发送给minion的命令执行结果将返回给salt-master.Saltstack Returnner的接口允许将结果发送给任意系统. GitHub:https://github.com/saltstack/salt/tree/develop/salt/returners 官网:https://docs.saltstack.com/en/latest/ref/returners/ 二,returnner模块列表 三,案例 1,returnner返回到s

[转帖]【MySQL+keepalived】用keepalived实现MySQL主主模式的高可用

[MySQL+keepalived]用keepalived实现MySQL主主模式的高可用 https://www.jianshu.com/p/8694d07595bc 一.实验说明 MySQL主主模式,是两台MySQL数据库互为主从. 此实验是用keepalived实现MySQL主主模式的高可用,基于已经安装好了主主架构的MySQL,然后配置keepalived,验证高可用性! 二.实验环境 操作系统:CentOS 7.5 serverA:192.168.1.104 serverB: 192.1