【问题标题】:R dbEscapeStrings doesnt appear to work as expectedR dbEscapeStrings 似乎没有按预期工作
【发布时间】:2021-06-07 12:27:17
【问题描述】:

努力用单引号转义字符串,以便查询数据库。

以下文档中的示例让我更加困惑:

https://www.rdocumentation.org/packages/RMySQL/versions/0.10.20/topics/dbEscapeStrings
https://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf

例子说明:

tmp <- sprintf("SELECT * FROM emp WHERE lname = %s", "O'Reilly")  
dbEscapeStrings(con, tmp)

据我所知,这会(并且确实)生成不正确的 sql: select * from emp where lname = O'Reilly

我尝试在 %s: 周围添加引号:

tmp <- sprintf('SELECT * FROM emp WHERE lname = "%s"', "O'Reilly")  
escaped_query <- dbEscapeStrings(con, tmp)

tmp:select * from emp where lname = \"O'Reilly\"
转义查询:select * from emp where lname = \\\"O\\'Reilly\\\"

我相信我需要得到以下输出:
select * from emp where lname = "O\'Reilly"

我想念什么吗?

【问题讨论】:

  • 永远不要使用sprintf 来生成查询:即使是无意的sql注入也可能由于unicode或其他一些原因而发生。虽然有sqlInterpolate,但我更喜欢使用parameter binding

标签: mysql r rmysql


【解决方案1】:

我强烈反对sprintf(或pasteglue(.),尽管glue_sql(.) 是合理的)。我的偏好是参数绑定。

dbGetQuery(con, "SELECT * FROM emp WHERE lname = ?", params = list("O'Reilly") )

更多原因(无意的 SQL 注入)和修复方法(sqlInterpolatedbBind)可以在这里找到:https://db.rstudio.com/best-practices/run-queries-safely/

顺便说一句,SQL 中的字符串文字通常用单引号表示,而不是双引号,所以你应该看到类似

DBI::sqlInterpolate(con, "select * from abc where lname ?name", name="O'Reilly")
# <SQL> select * from abc where lname 'O''Reilly'

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2016-01-24
    • 1970-01-01
    • 2022-12-17
    • 2013-02-10
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多