Java Jooq/PostgreSQL INSERT子句中的反斜杠

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向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版本
数据库:

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与当前版本兼容。