You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB从10.1升级至10.5后警告转错误的技术咨询

问题描述

原本配置一致的两台系统,将系统1的MariaDB从10.1版本升级至10.5版本后,原本仅触发警告的操作(如字段无默认值、字符串转整数)现在直接抛出错误,且未手动修改任何设置。请问升级过程中哪些设置可能被自动变更?如何检查严格类型相关配置?

系统信息

系统1

  • 服务器版本:10.5.15-MariaDB-0+deb11u1 - Debian 11
  • 协议版本:10
  • 数据库客户端版本:libmysql - mysqlnd 8.0.23
  • SELECT @@SQL_MODE; 结果:STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

系统2

  • 服务器版本:10.1.48-MariaDB-0+deb9u2 - Debian 9.13
  • 协议版本:10
  • 数据库客户端版本:libmysql - mysqlnd 8.0.13
  • SELECT @@SQL_MODE; 结果:NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

测试环境SQL

DROP TABLE IF EXISTS `testtable`;
CREATE TABLE `testtable` (
  `id` int(11) NOT NULL,
  `testid` int(11) NOT NULL,
  `testint` int(11) NOT NULL DEFAULT 0,
  `testtext` longtext COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `testtable` (`id`, `testid`, `testint`, `testtext`) VALUES
(1, 1,  1542629089, '');

ALTER TABLE `testtable`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `testtable`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;

查询1

INSERT INTO `testtable` ( `testid`,`testint` ) VALUES ("19", "0");

系统1响应

INSERT INTO `testtable` ( `testid`,`testint` ) VALUES ("19", "0");

MySQL said: Documentation
#1364 - Field 'testtext' doesn't have a default value

系统2响应

1 row inserted.
Inserted row id: 11 (Query took 0.0001 seconds.)
INSERT INTO `testtable` ( `testid`,`testint` ) VALUES ("19", "0");
[ Edit inline ] [ Edit ] [ Create PHP code ]
Warning: #1364 Field 'testtext' doesn't have a default value 

查询2

INSERT INTO `testtable` ( `testid`,`testint`, `testtext` ) VALUES ("20", "", "");

系统1响应

INSERT INTO `testtable` ( `testid`,`testint`, `testtext` ) VALUES ("20", "", "");

MySQL said: Documentation
#1366 - Incorrect integer value: '' for column `wafl_client_r4apps`.`testtable`.`testint` at row 1

系统2响应

1 row inserted.
Inserted row id: 12 (Query took 0.0001 seconds.)
INSERT INTO `testtable` ( `testid`,`testint`, `testtext` ) VALUES ("20", "", "");

Warning: #1366 Incorrect integer value: '' for column 'testint' at row 1

解答

1. 升级过程中自动变更的关键设置

从两台系统的SQL_MODE对比就能看出核心差异:

  • STRICT_TRANS_TABLES:这个严格模式在MariaDB 10.2及以后版本中成为默认启用项。它会让InnoDB这类事务型存储引擎,在遇到数据插入/更新不符合字段约束时直接抛出错误,而非仅触发警告——这正是你遇到的操作从警告变错误的根本原因。
  • ERROR_FOR_DIVISION_BY_ZERO:该模式也是升级后自动添加的,不过它主要影响除以零的操作,和当前问题关联不大。

MariaDB版本升级时,如果原有配置未明确覆盖新版本的默认参数,就会自动启用这些严格模式配置项。

2. 检查严格类型相关配置的方法

查看当前生效的SQL模式

直接执行SQL命令:

SELECT @@SQL_MODE;

返回结果中,所有带STRICT_前缀的参数都是严格类型相关配置,比如STRICT_TRANS_TABLES、STRICT_ALL_TABLES等。

区分全局与会话级配置

如果需要确认全局配置和当前会话的配置差异,执行:

SELECT @@GLOBAL.SQL_MODE, @@SESSION.SQL_MODE;

全局配置是服务器启动时加载的,会话级配置可能被客户端或连接语句临时修改。

查看配置文件中的持久化设置

MariaDB的SQL_MODE通常在配置文件中定义(比如/etc/mysql/my.cnf、/etc/mysql/mariadb.conf.d/50-server.cnf等),直接查看这些文件中的sql_mode参数,就能确认持久化的配置项。


内容的提问来源于stack exchange,提问作者til

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:50:44