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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:12:40