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

