H2数据库2.1.214版本中VALUE作为字段名的报错解决方案咨询
解决H2 2.1.214版本中VALUE字段的语法错误问题(无法重命名字段)
问题背景
项目使用H2数据库做单元测试,升级至2.1.214版本后,执行如下建表语句时触发语法错误:
CREATE TABLE SRC_FIELD_VALUE ( ID NUMBER IDENTITY, INPUT_SRC_FIELD_REF_ID NUMBER, VALUE VARCHAR2(255), DESCRIPTION VARCHAR2(255) );
错误日志如下:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "CREATE TABLE SRC_FIELD_VALUE ( ID NUMBER IDENTITY, INPUT_SRC_FIELD_REF_ID NUMBER, [*]VALUE VARCHAR2(255), DESCRIPTION VARCHAR2(255) )"; expected "identifier"; SQL statement: CREATE TABLE TC_RULE_COMP_DATA ( ID NUMBER IDENTITY, RULE_REF_ID NUMBER, SORT_ORDER NUMBER, VALUE CLOB ) [42001-214]
已在POM.xml中配置NON_KEYWORDS=VALUE,ID,且尝试给VALUE加双引号,问题仍未解决,且无法重命名字段。
可行解决办法
确保NON_KEYWORDS参数正确传递:直接在JDBC URL中配置参数,而非仅依赖POM配置。例如:
jdbc:h2:mem:testdb;MODE=Oracle;NON_KEYWORDS=VALUE,ID部分场景下POM中的配置可能无法正确传递到H2的连接实例,JDBC URL配置更直接可靠。
使用反引号包裹关键字字段:将建表语句中的
VALUE改为`VALUE`,H2支持反引号作为标识符分隔符,避免关键字冲突:CREATE TABLE SRC_FIELD_VALUE ( ID NUMBER IDENTITY, INPUT_SRC_FIELD_REF_ID NUMBER, `VALUE` VARCHAR2(255), DESCRIPTION VARCHAR2(255) );双引号失效可能是因为H2在特定模式下会将双引号内的标识符视为区分大小写,而你的字段实际为大写,反引号无此限制。
检查配置覆盖情况:确认项目中其他配置(如Spring Boot的
application.properties、测试类中的连接参数)没有覆盖NON_KEYWORDS设置,确保参数最终被H2加载。临时降级H2版本:如果上述方法均无效,可临时降级至2.0.206等兼容版本,避免阻塞测试流程,后续再跟进H2官方的修复更新。
内容的提问来源于stack exchange,提问作者vs777
相关产品推荐
相关产品推荐

