MySQL 默认遵循宽松的数据处理策略,对越界值及异常数据不会主动验证或拦截,而是直接存储原始输入内容,即所谓“垃圾进,垃圾出”。此机制可能导致查询结果与语义预期不符。为提高数据一致性,MySQL 支持启用严格的 SQL 模式,该模式下系统将拒绝非法值并抛出错误,从而实现对数据完整性的强制约束,其行为与多数关系型数据库保持一致。

一般情况下,MySQL会按照表格进行对非正常值的处理:

数据类型非法值处理方式
数值类型超出范围的值将被截断至该类型允许的最近端点值。
TIME 类型与数值类型处理方式相同,截断至最近端点。
其他非TIME类型转换为该类型对应的“零”值(如 '0000-00-00'、'0000-00-00 00:00:00')。
字符串类型超出定义长度的部分将被截断。
ENUM 类型赋值非枚举成员时,该列将被设置为空字符串 ('')。
SET 类型赋值包含非集合成员的子串时,非法成员将被清除,仅保留合法成员后赋值。


如果再增删改查时发生表格内的非法值错误,则可以通过SHOW WARNINGS来查看报错内容。

再插入和修改数据时需要进行严格检查,则可采取以下语句之一:

SET sql_mode = 'STRICT_ALL_TABLES' ; 
SET sql_mode = 'STRICT_TRANS_TABLES';

对于支持事务的表,若是符合要求的值,事务将正常执行;若是非法值,则进行事务rollback回滚。

在严格模式下,ERROR_FOR_DIVISION_BY_ZERO 会阻止以零为除数的操作;非严格模式下该操作将产生警告并插入 NULL。NO_ZERO_DATE 在严格模式下阻止“零”日期值入库。NO_ZERO_IN_DATE 在严格模式下阻止月或日为零的不完整日期值入库。

MySQL 的严格模式会对其存储的数据进行严格校验,包括数据类型、格式、长度等。例如,若向整型字段写入字符串,或向长度受限的字符字段插入超长数据,在非严格模式下这些操作不会报错,而在严格模式下将被拒绝。尽管应用层通常也会进行数据校验,但非严格模式在开发中并无益处。开启严格模式可视为对代码质量的一种额外检验。若开发阶段未启用严格模式且未暴露错误,项目上线或迁移时极易出现数据兼容性问题。因此,建议在开发过程中始终开启严格模式,以提前发现潜在问题。

先看看当前的严格模式?

SELECT @@sql_mode;
点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)