严格模式下 MariaDB 10.4 插入非法数据报错与 MySQL 表现有何不同?

文章导读
MariaDB 作为 2009 年从 MySQL 5.1.38 分支出来的数据库,在严格模式下对非法数据的处理机制与 MySQL 基本一致,但具体报错行为可能因版本差异而有所不同,目前公开资料中未找到 MariaDB 10.4 与 MySQL 在严格模式下插入非法数据的具体对比测试数据。
📋 目录
  1. 原因分析
  2. 严格模式下的具体表现差异
  3. 解决方案
  4. 注意事项
  5. 参考来源
A A

严格模式下 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 连接器、连接和端口。

严格模式下的具体表现差异

在严格模式下,以下三种情况会产生报错:

  1. 无符号整数字段插入负值:严格模式下不能在无符号整数字段插入负值,会直接报错
  2. NOT NULL 字段未指定值:严格模式下,无默认值的 NOT NULL 字段在插入数据时必须指定值,否则报错
  3. 字符串超出定义长度:严格模式下,插入字符串不能超出定义长度

以字符串长度为例,在非严格模式下执行插入操作会成功插入数据,但是内容被截断,只剩 4 个字符;但是严格模式下会报错,数据不会被插入。

严格模式下 MariaDB 10.4 插入非法数据报错与 MySQL 表现有何不同?

解决方案

步骤一:查询当前 SQL 模式

执行以下命令查看当前数据库的 SQL 模式配置:

SELECT @@sql_mode;

这将返回当前会话的 SQL 模式设置,帮助确认是否开启了严格模式。

步骤二:设置严格模式

为当前会话设置严格模式:

SET sql_mode = 'STRICT_TRANS_TABLES';

或:

严格模式下 MariaDB 10.4 插入非法数据报错与 MySQL 表现有何不同?
SET sql_mode = 'STRICT_ALL_TABLES';

全局设置严格模式:

SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';

或者在 MySQL/MariaDB 配置文件中配置以下内容,再重启服务。

步骤三:设置非严格模式(如需要)

如果需要关闭严格模式,执行:

SET sql_mode = '';

注意:生产环境不建议关闭严格模式,因为可能导致数据质量问题。

注意事项

根据知识库中的实际用户反馈和常见问题,以下是需要特别注意的事项:

严格模式下 MariaDB 10.4 插入非法数据报错与 MySQL 表现有何不同?
  1. 连接失败常见报错:在排查数据库问题时,常见报错包括ERROR 2003 (HY000): Can't connect to MySQL serverERROR 1045 (HY000): Access deniedERROR 1032: Can't find record等,这些报错与严格模式无直接关系,但可能影响数据插入操作
  2. 主从复制异常:在 MySQL 8.0 环境下,主从复制可能出现Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND错误,这与严格模式下的数据验证行为有关
  3. DDL 任务失败:在分布式数据库中,DDL 出错时可能返回ERROR 3009 (HY000),需要手动处理 DDL 异常
  4. 版本差异:MariaDB 从 MySQL 分支出来以后一直在不断扩展其功能,其中一些变化导致了核心功能、能力和性能的差异,目前公开资料中未找到 MariaDB 10.4 与 MySQL 在严格模式下的具体性能对比数据

参考来源

来源:阿里云开发者社区 - 数据库严格模式_mysql 关系型数据库

来源:阿里云帮助中心 - MariaDB 和 MySQL 之间有何区别

来源:阿里云帮助中心 - 数据库连接失败或无法连接,如何排查:RDS MySQL、PostgreSQL、SQL Server、MariaDB

来源:阿里云开发者社区 - 面试高频题:哪些情况会导致 MySQL 主从复制异常