Java Jooq/PostgreSQL INSERT子句中的反斜杠
我正在尝试使用Jooq向PostgreSQL数据库中插入数据。如果字符串包含SQL状态代码为42601(表示语法错误)的反斜杠字符,则查询将失败Java Jooq/PostgreSQL INSERT子句中的反斜杠,java,postgresql,jooq,Java,Postgresql,Jooq,我正在尝试使用Jooq向PostgreSQL数据库中插入数据。如果字符串包含SQL状态代码为42601(表示语法错误)的反斜杠字符,则查询将失败 Jooq:3.4.4 postgresql驱动程序:8.4-702.jdbc4 PostgreSQL:“PostgreSQL 8.4.20在x86_64-redhat-linux-gnu上,由GCC GCC(GCC)4.4.7 20120313(Red Hat 4.4.7-4)编译,64位“ JDK 1.8.0_25 弹簧工具套件3.6.0.1版本
- Jooq:3.4.4
- postgresql驱动程序:8.4-702.jdbc4
- PostgreSQL:“PostgreSQL 8.4.20在x86_64-redhat-linux-gnu上,由GCC GCC(GCC)4.4.7 20120313(Red Hat 4.4.7-4)编译,64位“
- JDK 1.8.0_25
- 弹簧工具套件3.6.0.1版本
CREATE TABLE datahub.test (
body TEXT NOT NULL
);
使用maven生成的Jooq代码:
CREATE TABLE datahub.test (
body TEXT NOT NULL
);
- jooq codegen maven版本3.4.4
- generator.name:org.jooq.util.DefaultGenerator
- generator.database.name:org.jooq.util.postgres.PostgresDatabase
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/spring-config.xml"})
public class BatchExceptionJooqTest {
private static Logger log = LogManager.getLogger(BatchExceptionJooqTest.class);
@Autowired
private DSLContext db;
@Test
public void runBasicJooqTest(){
try{
final List<InsertQuery<TestRecord>> batchUpdate = Lists.newLinkedList();
InsertQuery<TestRecord> insertQuery = db.insertQuery(TEST);
insertQuery.addValue(TEST.BODY, "It's a bit more complicated than just doing copy and paste... :\\");
batchUpdate.add(insertQuery);
db.batch(batchUpdate).execute();
}catch(Exception e){
log.error(e);
}
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(位置={“/spring config.xml”})
公共类BatchExceptionJooqTest{
私有静态记录器log=LogManager.getLogger(BatchExceptionJooqTest.class);
@自动连线
专用上下文数据库;
@试验
public void runBasicJooqTest(){
试一试{
最终列表batchUpdate=Lists.newLinkedList();
InsertQuery InsertQuery=db.InsertQuery(测试);
addValue(TEST.BODY,“这比复制粘贴要复杂一点…:\ \”;
batchUpdate.add(insertQuery);
db.batch(batchUpdate.execute();
}捕获(例外e){
日志错误(e);
}
}
}
问题
测试失败,出现异常情况:
2014-12-26 17:11:16490[main]错误BatchException JooqTest:36:runBasicJooqTest-org.jooq.exception.DataAccessException:SQL[null];批处理条目0插入到“数据集线器”。“测试”(“正文”)值('比仅执行复制和粘贴要复杂一些…:\')已中止。调用getNextException查看原因
测试通过,如果不是字符串:“这比复制粘贴要复杂一点…”我使用字符串:“这比复制粘贴要复杂一点…”
。与操作期间单引号发生的情况相比,这似乎有点不一致。它正确地加倍,以便通过SQL解析器。反斜杠则不然
我在某个地方读到,用另一个反斜杠转义一个反斜杠不是SQL标准的一部分,Postgre最近改变了它的默认行为。然而,我不清楚的意思-它似乎表明,双反斜杠应该工作,并没有任何理由真的jooq不这样做
所以。。是否有人能解释一下Jooq中描述的情况:
我的应用程序正在处理的所有传入反斜杠是否都是期望的行为,并且除了加倍所有传入反斜杠之外,没有其他解决方法
是期望的行为,但我可以做一个配置更改,使Jooq以类似于单引号的方式处理反斜杠
是虫子吗
我做错了什么
谢谢您正在使用PostgreSQL 8.x。在该版本中,系统默认接受反斜杠转义字符串文字,即使没有前面的E
为了避免这种情况,您应该将服务器配置变量standard\u compliance\u strings
设置为ON
当然,强烈建议您迁移到高于8.x的PostgreSQL版本,因为8.x版本已经过时,不再受支持。jOOQ 3.5引入了org.jOOQ.conf.Settings.backslashEscaping
()。这主要是针对MySQL引入的,MySQL至今仍然默认使用反斜杠进行不符合标准的字符串文字转义
请注意,此设置仅影响内联绑定值,因此在将值绑定到PreparedStatement
时,它不会转义反斜杠
我同意,这建议您更改数据库行为或升级到较新的PostgreSQL版本。此Postgre侧标志是否会影响Jooq格式化发送到数据库的参数字符串的方式?最奇怪的是,Jooq设置了单个引号的格式,而不是反斜杠的格式。@Tarmo:Jooq没有明确支持PostgreSQL 8.x以及该版本最新时存在的所有怪癖。换句话说,约克并不知道这种特殊的行为,卢卡斯·埃德尔是对的。就jOOQ而言,字符串中的反斜杠不是特殊字符。通过启用我提到的配置选项,可以使PostgreSQL 8.x forward与当前版本兼容。