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

Spring Boot从2.2.x升级至2.7.5后H2数据库Liquibase迁移失败

Spring Boot 2.7.5升级后Liquibase+H2迁移语法错误解决

问题背景

Spring Boot从2.2.x版本升级至2.7.5版本后,测试阶段Liquibase数据库迁移失败。涉及的迁移文件为changelog.v1.mysql.sql,同时测试环境的H2数据库版本从1.4.197升级到了2.1.214。

原迁移SQL语句:

ALTER TABLE my_table CHANGE column `OLD_COLUMN` `NEW_COLUMN` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '';

测试环境数据库配置:

spring.datasource.url=jdbc:h2:mem:system42;MODE=MySQL;NON_KEYWORDS=value
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

报错信息

迁移时触发SQL语法错误:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "ALTER TABLE my_table CHANGE column `OLD_COLUMN` `NEW_COLUMN` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci [*]NOT NULL DEFAULT ''"; SQL statement:
ALTER TABLE my_table CHANGE column `OLD_COLUMN` `NEW_COLUMN` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' [42000-214]

原因分析

H2 2.x版本对MySQL模式下的SQL语法兼容性要求更严格,原语句中的CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci部分不符合H2在MySQL模式下的ALTER TABLE CHANGE语法规范。而旧版本H2(1.4.197)对这类非标准语法有更宽松的兼容,因此升级后触发语法错误。

解决方案

移除SQL语句中的字符集和排序规则声明,修改后的SQL如下:

ALTER TABLE my_table CHANGE column `OLD_COLUMN` `NEW_COLUMN` varchar(255) NOT NULL DEFAULT '';

修改后重新执行Liquibase迁移,即可正常完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:35:19