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

Flyway迁移后MariaDB列默认值从None变为NULL的原因排查

问题描述

当前使用10.3.15-MariaDB数据库,存在多个NOT NULL且默认值为None的列。通过Flyway将表迁移至同版本的新数据库后,这些列均变为NOT NULL且默认值为NULL。

原表创建语句片段:

CREATE TABLE `accounts_deleted` (
  `account_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  -- 其他列省略
);

迁移后执行describe accounts_deleted的结果片段:

MariaDB [main]> describe accounts_deleted;
+-------------------------+-------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+----------------+
| Field                   | Type                                                                                                                                | Null | Key | Default             | Extra          |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+----------------+
| account_id               | int(11) unsigned                                                                                                                    | NO   | PRI | NULL                | auto_increment |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+----------------+

已确认新旧数据库为完全相同的10.3.15-MariaDB版本,问题仍存在,询问可能的原因及是否存在未注意到的严格性设置。

可能的原因分析
  • Flyway的SQL解析逻辑问题:MariaDB中None作为默认值属于特定行为,并非标准SQL写法。Flyway在提取原表元数据生成迁移脚本时,可能无法正确识别None,将其解析为标准的NULL,导致目标库列默认值被设置为NULL。
  • SQL_MODE配置差异:即使版本一致,新旧库的SQL_MODE可能不同。比如原库开启了NO_AUTO_VALUE_ON_ZERO等影响默认值解析的模式,而目标库未开启;或者严格模式(STRICT_TRANS_TABLES/STRICT_ALL_TABLES)的开启状态不同,严格模式下对默认值的校验逻辑更严格,可能改变默认值的存储行为。可通过SELECT @@SQL_MODE;在新旧库执行并对比结果。
  • 表属性差异:新旧库的默认存储引擎、表字符集或校对规则不同,可能间接影响列默认值的存储和显示。执行SHOW CREATE TABLE accounts_deleted;在新旧库对比,确认表的完整定义是否一致。
  • 迁移脚本错误:若迁移脚本为手动编写,可能误将None替换为NULL;若为Flyway自动生成,可检查Flyway配置(如flyway.encoding、flyway.sqlMigrationSuffix)是否导致脚本解析生成时出现错误。
  • MariaDB系统变量差异:innodb_strict_mode、sql_auto_is_null等系统变量的设置不同,也可能影响列默认值的处理逻辑。可通过SHOW VARIABLES LIKE '%strict%';和SHOW VARIABLES LIKE '%auto_is_null%';对比新旧库的变量值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:02:47