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

H2数据库表名大小写问题:Spring+MyBatis操作表找不到报错

H2数据库表名大小写不匹配问题原因及解决

问题原因

出现这个问题的核心是H2数据库对标识符(表名、列名)的大小写处理规则导致的:

  • H2默认会将未加引号的SQL标识符(比如表名、列名)转换为大写。如果你的表实际是小写的address(比如创建表时用了CREATE TABLE address (...)且H2处于区分大小写模式,或者创建时用了引号CREATE TABLE "address" (...)),当你执行未加引号的INSERT INTO address ...时,H2会把address转成ADDRESS去查找,自然找不到实际存在的小写表。
  • 报错里的候选表"address"带引号,说明数据库里的表名是保留小写的,而你的SQL语句里的表名没加引号,被H2转成大写后匹配失败。

解决方法

  • 修改H2连接URL配置:在JDBC连接URL中添加DATABASE_TO_UPPER=FALSE参数,禁用H2自动将标识符转为大写的行为。示例:
    jdbc:h2:mem:yourdbname;DATABASE_TO_UPPER=FALSE
    
  • 统一表名大小写:如果不想修改配置,要么创建表时用大写(CREATE TABLE ADDRESS (...)),执行SQL时也用大写;要么创建和查询时都给表名加双引号(INSERT INTO "address" (...)),但引号方式会让SQL可读性下降,不推荐。
  • 检查H2大小写敏感配置:如果你的H2数据库设置了CASE_INSENSITIVE_IDENTIFIERS=FALSE(区分大小写),更要注意标识符的大小写一致性,此时未加引号的标识符会严格区分大小写。

报错信息

org.springframework.jdbc.BadSqlGrammarException:

Error updating database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "ADDRESS" not found (candidates are: "address"); SQL statement:

INSERT INTO address ( city,
street ) VALUES ( ?,
? ) [42103-220]

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:39:52