MySQL转H2数据库DDL报错:未知数据类型'fieldF'求助
解决H2内存数据库初始化时"Unknown data type: 'fieldF'"的问题
这个报错其实有点误导性,真正的问题藏在DDL和H2的兼容配置里,我帮你一步步梳理排查:
1. 先修正DDL里的主键语法错误
你的DDL中定义了PRIMARY KEY (id),但整个表结构里根本没有id字段!正确的主键应该指向fieldA(因为它是AUTO_INCREMENT的字段)。这个低级语法错误会导致H2解析DDL时逻辑混乱,进而抛出错误的数据类型提示。修正后的主键部分应该是:
PRIMARY KEY (`fieldA`)
2. 处理MySQL专属语法与H2的兼容性
H2不支持MySQL特有的ENGINE=InnoDB和DEFAULT CHARSET=utf8配置项,你有两种解决方式:
- 方案一:直接修改DDL
移除这些H2不识别的MySQL专属配置,修正后的完整DDL如下:CREATE TABLE `foo` ( `fieldA` BIGINT(20) NOT NULL AUTO_INCREMENT, `fieldB` BIGINT(20) NOT NULL, `fieldC` TIMESTAMP NOT NULL, `fieldD` TIMESTAMP NOT NULL, `fieldE` VARCHAR(40) NOT NULL, `fieldF` VARCHAR(40) NOT NULL, `fieldG` CHAR(3) NOT NULL, PRIMARY KEY (`fieldA`), KEY `fieldF` (`fieldF`) ); - 方案二:开启H2的MySQL兼容模式
如果你不想修改DDL,可以在Spring Boot的数据源配置中添加兼容模式参数,让H2模拟MySQL的语法解析:@Bean public DataSource tlDataSource() { return new EmbeddedDatabaseBuilder() .generateUniqueName(true) .setType(H2) .setScriptEncoding("UTF-8") .ignoreFailedDrops(true) .setUrl("jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1") // 新增兼容配置 .addScript("sql/ve/init.sql") .build(); }
3. 额外注意事项
- 开启MySQL兼容模式后,H2会更好地支持MySQL风格的数据类型写法(比如
BIGINT(20)、AUTO_INCREMENT) - 如果后续遇到TIMESTAMP相关的问题,可以在H2的URL中追加
DATABASE_TO_LOWER=TRUE参数,进一步优化兼容性
按照上面的步骤调整后,应该就能正常初始化H2数据库了。
内容的提问来源于stack exchange,提问作者rnmalone
相关产品推荐
相关产品推荐

