如果没有PreparedStatement,你如何正确地逃避字符串?

时间:2011-07-26 22:01:13

标签: postgresql encoding jdbc escaping

我正在使用Statement的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.

2 个答案:

答案 0 :(得分:5)

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

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

E.g。

  

以下不那么简单的例子用西里尔字母写下俄语单词“slon”(elephant):

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

答案 1 :(得分:1)

JDBC的方式是:

QueryExecutorImpl.parseQuery()

  • 将字符串分解为片段,处理单引号,双引号,行注释,阻止注释,美元符号并注意到?替换。
  • 创建SimpleQuery对象

SimpleParameterList

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

不幸的是,为了获得完整的字符串转义(使用编码,处理特殊字符等),您可能需要以某种方式访问​​和使用QueryExecutorImpl,我无法弄清楚如何去做。 PreparedStatement内部使用QueryExecutorImpl

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