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

Spring Boot中data.sql初始化H2数据库遇反斜杠转义异常

H2内存数据库SQL脚本末尾反斜杠导致语法异常的问题解答

官方说明

H2 1.4.200及同系列旧版本存在SQL脚本解析的已知问题:当字符串字面量以反斜杠结尾时,解析器会错误地将该反斜杠视为对后续单引号的转义,破坏脚本的语句分割逻辑(比如误判后续INSERT语句中的分号为语句结束符)。该问题已在H2 2.0及以上版本被官方修复,相关修复记录可在H2版本更新日志中查阅。

更优解决方法

1. 使用H2原生字符串分隔符

H2支持用$$作为字符串边界分隔符,这种方式下字符串内部的反斜杠、单引号等特殊字符无需转义,直接作为字面量处理。修改data.sql中的插入语句:

INSERT INTO TEST.ONE(IDENTIFIER,NAME) VALUES
    (1,$$\1\3\$$);

INSERT INTO TEST.TWO(IDENTIFIER,NAME) VALUES
    (1,'test;test');

可正确存入\1\3\字面量,且不会破坏脚本的语句解析。

2. 升级H2驱动版本到2.x+

将H2依赖版本升级到2.0及以上(如2.2.224),新版本修复了该字符串解析Bug,原语句INSERT INTO TEST.ONE(IDENTIFIER,NAME) VALUES (1,'\1\3\');可直接正常执行,无需修改脚本。

3. 调整Spring Boot脚本语句分隔符(临时替代方案)

在application.properties中配置自定义语句分隔符,避免分号被误判:

spring.datasource.separator=;;

同时修改data.sql中的语句结束符为;;:

INSERT INTO TEST.ONE(IDENTIFIER,NAME) VALUES
    (1,'\1\3\');;

INSERT INTO TEST.TWO(IDENTIFIER,NAME) VALUES
    (1,'test;test');;

此方法仅为绕开解析问题,优先级低于前两种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:37:26