没有准备好的语句的 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 准备好的语句不能正确转义