严格模式下 MariaDB 10.4 插入非法数据报错与 MySQL 表现有何不同?
核心结论:MariaDB 作为 2009 年从 MySQL 5.1.38 分支出来的数据库,在严格模式下对非法数据的处理机制与 MySQL 基本一致,但具体报错行为可能因版本差异而有所不同,目前公开资料中未找到 MariaDB 10.4 与 MySQL 在严格模式下插入非法数据的具体对比测试数据。
原因分析
严格模式(SQL Mode)是数据库管理系统用于控制数据验证行为的重要配置。在 MySQL 和 MariaDB 中,严格模式主要通过以下两个参数控制:
STRICT_TRANS_TABLES:对于支持事务的表(如 InnoDB),插入非法数据时会直接报错并回滚STRICT_ALL_TABLES:对所有表都严格执行,包括不支持事务的表
根据知识库资料,两者的唯一区别是:对于不支持事务的表,若开启 STRICT_TRANS_TABLES,MySQL 会尝试将一个不合法的字段值转换成一个值最近的合法值插入表中;而开启 STRICT_ALL_TABLES 后,则表现为不写入数据,且抛出错误。由于现在绝大部分用的 InnoDB 引擎是支持事务的,所以基本不用关心这种区别。
MariaDB 是 MySQL 的修改版本,2009 年开发人员发布了 MariaDB,作为 MySQL 5.1.38 的代码分支。MariaDB 保留了 MySQL 的结构、命名约定和数据定义文件,还支持所有 MySQL 连接器、连接和端口。
严格模式下的具体表现差异
在严格模式下,以下三种情况会产生报错:
- 无符号整数字段插入负值:严格模式下不能在无符号整数字段插入负值,会直接报错
- NOT NULL 字段未指定值:严格模式下,无默认值的 NOT NULL 字段在插入数据时必须指定值,否则报错
- 字符串超出定义长度:严格模式下,插入字符串不能超出定义长度
以字符串长度为例,在非严格模式下执行插入操作会成功插入数据,但是内容被截断,只剩 4 个字符;但是严格模式下会报错,数据不会被插入。
解决方案
步骤一:查询当前 SQL 模式
执行以下命令查看当前数据库的 SQL 模式配置:
SELECT @@sql_mode;这将返回当前会话的 SQL 模式设置,帮助确认是否开启了严格模式。
步骤二:设置严格模式
为当前会话设置严格模式:
SET sql_mode = 'STRICT_TRANS_TABLES';或:
SET sql_mode = 'STRICT_ALL_TABLES';全局设置严格模式:
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';或者在 MySQL/MariaDB 配置文件中配置以下内容,再重启服务。
步骤三:设置非严格模式(如需要)
如果需要关闭严格模式,执行:
SET sql_mode = '';注意:生产环境不建议关闭严格模式,因为可能导致数据质量问题。
注意事项
根据知识库中的实际用户反馈和常见问题,以下是需要特别注意的事项:
- 连接失败常见报错:在排查数据库问题时,常见报错包括
ERROR 2003 (HY000): Can't connect to MySQL server、ERROR 1045 (HY000): Access denied、ERROR 1032: Can't find record等,这些报错与严格模式无直接关系,但可能影响数据插入操作 - 主从复制异常:在 MySQL 8.0 环境下,主从复制可能出现
Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND错误,这与严格模式下的数据验证行为有关 - DDL 任务失败:在分布式数据库中,DDL 出错时可能返回
ERROR 3009 (HY000),需要手动处理 DDL 异常 - 版本差异:MariaDB 从 MySQL 分支出来以后一直在不断扩展其功能,其中一些变化导致了核心功能、能力和性能的差异,目前公开资料中未找到 MariaDB 10.4 与 MySQL 在严格模式下的具体性能对比数据
参考来源
来源:阿里云开发者社区 - 数据库严格模式_mysql 关系型数据库
来源:阿里云帮助中心 - MariaDB 和 MySQL 之间有何区别
来源:阿里云帮助中心 - 数据库连接失败或无法连接,如何排查:RDS MySQL、PostgreSQL、SQL Server、MariaDB
来源:阿里云开发者社区 - 面试高频题:哪些情况会导致 MySQL 主从复制异常