宽松模式和严格模式
宽松模式
如果设置的是宽松模式,那么我们在插入数据的时候,即使是给了一个错误的数据,那么可能也不会报错。
举例:某张表的name字段为 char(10) ,插入数据的时候,如果name字段的数据长度超过了10,如‘1234567890abc’,那么不会报错,mysql会自行处理,截取前10个字符存储,这就是宽松模式。
应用场景:通过设置sql_mode为宽松模式,来保证大多数的SQL符合标准的SQL语法。这样应用在不同数据库之间进行迁移时,则不需要对业务SQL进行较大的修改。
严格模式
MySQL 5.7将sql_mode默认值改为了严格模式,所以在生产环境中必需采用严格模式。
存在的问题
若sql_mode的设置中包含了 NO_ZERO_DATE,那么数据库不允许插入零日期,插入零日期会抛出错误。若表中含有 TIMESTAMP 字段,如果未声明为NULL或显式DEFAULT子句,将自动分配 DEFAULT ‘0000-00-00 00:00:00’(零时间戳),这显然是不满足sql_mode中的 NO_ZERO_DATE 而报错。
宽松模式举例
查看表中的数据
设置 sql_mode 模式为 STRICT_TRANS_TABLES ,然后插入数据
此时,数据库会直接报错。
模式查看和设置
查看当前的sql_mode
select @@session.sql_mode
select @@global.sql_mode
#或者
show variables like 'sql_mode';
临时设置sql_mode
SET GLOBAL sql_mode = 'modes...'; #全局
SET SESSION sql_mode = 'modes...'; #当前会话
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
永久设置
在my.cnf文件(windows系统是my.ini文件),新增
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
需要重启MySQL服务。