如何解决向H2数据库填充数据时的BINARY与CHARACTER类型不可比较问题
解决方案汇总
一、解决外键类型不匹配(BINARY vs VARCHAR)问题
- 强制对齐主外键字段类型:检查
schema.sql中所有关联表的主键、外键定义,确保类型完全一致。例如主表主键为VARCHAR(255),从表外键必须同样定义为VARCHAR(255),不能写成BINARY(255)。
示例正确写法:-- 主表 CREATE TABLE user ( user_id VARCHAR(255) PRIMARY KEY ); -- 从表 CREATE TABLE order ( order_id VARCHAR(255) PRIMARY KEY, user_id VARCHAR(255) REFERENCES user(user_id) ); - 排查JPA隐式类型映射:如果同时开启了JPA自动建表(
spring.jpa.hibernate.ddl-auto不为none),需确保实体类字段类型与schema.sql定义一致。例如实体类中用String类型的字段,JPA默认映射为VARCHAR,不要手动在schema.sql中改为BINARY。 - 校验
import.sql数据格式:插入外键值时,确保数据类型与表定义匹配,字符串类型值需加单引号,避免二进制格式的误输入。
二、解决H2文件模式的版本兼容与锁定问题
版本不兼容
- 删除旧的H2数据库文件(如
mydb.mv.db),不同H2版本的文件格式不兼容,2.1.214版本需使用全新的数据库文件。
文件锁定
- 修改数据源URL配置,添加
AUTO_SERVER=TRUE和DB_CLOSE_ON_EXIT=FALSE参数,允许多个进程共享数据库文件:spring.datasource.url=jdbc:h2:file:./data/mydb;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE;MODE=MySQL - 关闭IDEA中已打开的H2控制台连接后再重启项目,避免多进程抢占文件资源。
- 排查并终止其他占用H2文件的Java进程(可通过任务管理器或
jps命令查看)。
三、IntelliJ IDEA中正常查看H2数据库
- 打开IDEA的
Database工具窗口,点击+选择Data Source>H2。 - 配置数据源参数:
- 内存模式:URL填写
jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1(需与项目中application.properties的URL一致)。 - 文件模式:URL填写
jdbc:h2:file:./data/mydb;AUTO_SERVER=TRUE(与项目配置一致)。
- 内存模式:URL填写
- 选择与项目依赖一致的H2驱动版本(2.1.214),避免版本不兼容导致连接失败。
- 点击
Test Connection验证连接,成功后即可查看表结构与数据。
内容的提问来源于stack exchange,提问作者invzbl3
相关产品推荐
相关产品推荐

