H2内存数据库将插入值误识别为列名的问题求助
解决H2数据库把插入值识别为列名的问题
这个问题我之前也碰到过,核心是SQL字符串常量的引号使用规范差异导致的,咱们一步步拆解原因和解决方案:
为什么会报错?
H2数据库严格遵循SQL标准:
- 用**单引号
'**包裹字符串常量(比如你要插入的角色名ROLE_USER) - 用**双引号
"**标识数据库对象(比如列名、表名)
你在data.sql里写的INSERT INTO roles(name) VALUES ("ROLE_USER");用了双引号,H2就会把"ROLE_USER"当成一个列名去查找,自然找不到对应的列,所以抛出Column "ROLE_USER" not found的错误。
而MySQL在默认SQL模式下允许用双引号表示字符串,这就是你觉得语句正确但H2报错的原因——两个数据库的引号规则不一样。
快速解决方法
直接修改data.sql里的插入语句,把双引号换成单引号就行:
INSERT INTO roles(name) VALUES ('ROLE_USER');
兼容MySQL和H2的额外配置
如果你的项目需要同时在MySQL和H2下运行,还可以通过配置让H2兼容MySQL的引号规则:
在H2的JDBC URL中添加MODE=MYSQL参数:
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
不过还是更推荐遵循SQL标准用单引号,这样能避免跨数据库的兼容性坑。
内容的提问来源于stack exchange,提问作者Slippy
相关产品推荐
相关产品推荐

