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;
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程