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
相关产品推荐
相关产品推荐

