在没有 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 没有影响