gpt4 book ai didi

java - Jooq/PostgreSQL INSERT 子句中的反斜杠

转载 作者:行者123 更新时间:2023-11-29 13:29:13 32 4
gpt4 key购买 nike

我正在尝试使用 Jooq 将 INSERT 插入到 PostgreSQL 数据库中。如果字符串包含带有 SQL 状态代码的反斜杠字符,查询将失败:42601,这意味着语法错误。

  • Jooq:3.4.4
  • postgresql驱动:8.4-702.jdbc4
  • PostgreSQL:“PostgreSQLx86_64-redhat-linux-gnu 上的 8.4.20,由 GCC gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) 编译,64 位”
  • JDK 1.8.0_25
  • Spring 工具套件 3.6.0.RELEASE

数据库:

CREATE TABLE datahub.test (
body TEXT NOT NULL
);

使用maven生成的Jooq代码:

  • 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);
}
}
}

问题

测试失败并出现异常:

2014-12-26 17:11:16,490 [main] 错误 BatchExceptionJooqTest:36:runBasicJooqTest - org.jooq.exception.DataAccessException: SQL [null];批处理条目 0 插入到“datahub”中。“test”(“body”)值('它'比仅仅进行复制和粘贴要复杂一些......:\')被中止。调用 getNextException 查看原因。

测试通过,如果不是 String: "它比只做复制和粘贴要复杂一点...:\\" 我使用 String: "它有点复杂比仅仅复制和粘贴要复杂...:\\\\"。与操作期间单引号发生的情况相比,这似乎有点不一致。它被正确地加倍以便通过 SQL 解析器。反斜杠不是这样。

我在某处读到,用另一个反斜杠转义一个反斜杠不是 SQL 标准的一部分,Postgre 最近更改了它的默认行为。但是我不清楚 manual p 4.1.2.2 的含义- 这似乎表明双反斜杠应该起作用,而且 jooq 没有任何理由不这样做。

所以..有人可以解释一下 Jooq 中所描述的情况吗:

  1. 是否是所需的行为,除了将我的应用程序正在处理的所有传入反斜杠加倍之外没有解决方法?
  2. 是否需要行为,但我可以更改配置以使 Jooq 以与单引号类似的方式处理反斜杠?
  3. 这是一个错误吗?
  4. 我做错了什么?

谢谢

最佳答案

您正在使用 PostgreSQL 8.x。在该版本中,系统默认接受反斜杠转义字符串文字,即使没有前面的 E

为避免这种情况,您应该将服务器配置变量 standard_conforming_strings 设置为 ON

当然,强烈建议您迁移到高于 8.x 的 PostgreSQL 版本,因为 8.x 版本已停产,不再受支持。

关于java - Jooq/PostgreSQL INSERT 子句中的反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27658960/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com