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

