【问题标题】:How do you properly escape strings without PreparedStatement?在没有 PreparedStatement 的情况下如何正确转义字符串?
【发布时间】:2023-03-06 02:22:01
【问题描述】:

我将语句用于 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 字符串。)

标签: postgresql encoding jdbc escaping


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2017-09-20
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多