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
相关产品推荐
相关产品推荐

