没有准备好的语句的 SQL 中的转义字符

Posted

技术标签:

【中文标题】没有准备好的语句的 SQL 中的转义字符【英文标题】:Escape characters in SQL without Prepared Statement 【发布时间】:2016-08-01 20:20:22 【问题描述】:

我知道有很多问题专门问这个问题,但我不确定我的情况。我正在使用 Spring Batch 和 FieldSetMapper,因此我将这些语句生成为字符串,并收集这些字符串并将它们传递给我的 ItemWriter。从这个意义上说,我不打算使用准备好的语句。这是我得到的:

private static String insertStmt = "insert into ..." 
//this is the beginning of the insert statement. Not gonna type it all out

private String addStatement() 

    String values = String
            .format("values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ESCAPE '\'')",
                    this.primCustNum, this.primCustName, this.mfstRptId,
                    this.shtlStpNum, this.primCustAddr1,
                    this.primCustAddr2, this.primCustCity,
                    this.primCustState, this.primCustPostalCde,
                    this.primCustPhoneNum);

    //log.info("INSERT+VALUES: ", insertStmt + values);
    return insertStmt + values;


但这不会处理类似的情况 insert into ... where values ('tony's place', ...); 因为tony's 有一个撇号

【问题讨论】:

【参考方案1】:

看看这个答案: How to escape single quotes for SQL insert...when string to insert is in a user generated variable

您需要在将 insertStmt 发送到 insert 之前加上两个引号,如下所示:

this.primCustNum = this.primCustNum.replace("'","''");

【讨论】:

【参考方案2】:

只需创建另一个将字符串作为参数并对其进行迭代的私有方法,如果检测到特殊字符,它将在字符之前放置一个反斜杠并返回新字符串(带有这些反斜杠)。然后,在创建 sql 语句期间,使用您的文本作为参数调用此私有方法,而不是纯文本。

【讨论】:

这行不通,因为在 SQL 中,您通过使用两个撇号来转义撇号,例如 support.microsoft.com/en-us/kb/156501。

以上是关于没有准备好的语句的 SQL 中的转义字符的主要内容,如果未能解决你的问题,请参考以下文章

对于 postgresql,java sql 准备好的语句不能正确转义

在 Java 中转义 MySQL 字符串...没有准备好的语句

提交表单中的字符串中的转义字符

sql server 转义字符

JDBC驱动程序为准备好的语句转义参数?

Mysql like语句转义字符