在没有 PreparedStatement 的情况下如何正确转义字符串?

Posted

技术标签:

【中文标题】在没有 PreparedStatement 的情况下如何正确转义字符串?【英文标题】:How do you properly escape strings without PreparedStatement? 【发布时间】:2011-07-26 22:01:12 【问题描述】:

我将语句用于 executeUpdate 和 executeQuery。我连接到 SQL 查询中的字符串值至少可以包含 '\ 字符以及 Unicode。

PreparedStatement 似乎会自动执行此操作,但 JDBC 库中是否有一些实用函数可以转义任意字符串以用于 SQL 查询?

我遇到的错误示例:

org.postgresql.util.PSQLException: ERROR: unterminated quoted string at or near

org.postgresql.util.PSQLException: ERROR: invalid Unicode escape
  Hint: Unicode escapes must be \uXXXX or \UXXXXXXXX.

【问题讨论】:

为什么准备好语句? :( 每当我完成动态 SQL 时,字符串只是动态 wrt。结构/模式和不是数据。(使用动态 SQL 字符串。) 【参考方案1】:

不,它不是 JDBC 的一部分,并且对于不同的数据库管理系统是不同的。您真的应该使用PreparedStatement 进行带参数的查询。由于可以编译查询,因此更安全且性能更好。

请参阅 PostgreSQL 手册中的 4.1. SQL Syntax - Lexical Structure。

例如

以下不那么琐碎的示例用西里尔字母书写了俄语单词“slon”(大象):

U&"\0441\043B\043E\043D"

【讨论】:

谢谢!从技术上讲,它是 JDBC 的一部分,因为它在内部执行。【参考方案2】:

JDBC 的做法是:

QueryExecutorImpl.parseQuery()

将字符串分成片段,处理单引号、双引号、行 cmets、块 cmets、美元符号并记下 ?用于替换。 创建一个 SimpleQuery 对象

简单参数列表

处理字符串编码(UTF-8、bytea 等)

不幸的是,要获得完整的字符串转义(通过编码、特殊字符处理等),您可能需要以某种方式访问​​和使用QueryExecutorImpl,而我无法弄清楚如何做到这一点. PreparedStatement 在内部使用 QueryExecutorImpl

结论,最好和最简单的方法可能是使用PreparedStatement

【讨论】:

以上是关于在没有 PreparedStatement 的情况下如何正确转义字符串?的主要内容,如果未能解决你的问题,请参考以下文章

在不知道数据类型的情况下将值绑定到 PreparedStatement

Java、PreparedStatement、TransactSQL (MS SQL)、最后插入 ID

PreparedStatement 没有?在 where 子句中

MySQL JDBC closeOnCompletion 对 PreparedStatement 没有影响

JDBC:使用 PreparedStatement 创建表,SQL 语法错误与否?

java中PreparedStatement执行带参数的sql语句如何实现模糊查询?