【MySQL】六,sql_model的合理设置

宽松模式和严格模式

宽松模式

如果设置的是宽松模式,那么我们在插入数据的时候,即使是给了一个错误的数据,那么可能也不会报错。
举例:某张表的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服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值