Microsoft SQL 服务器数据库的 RMySQL::dbEscapeStrings() 等效项

Equivalent of RMySQL::dbEscapeStrings() for a Microsoft SQL Server Database

我编写了一个 shiny 应用程序,它使用 MySQL 后端来存储不受控制的用户输入并与之交互。用户不可避免地会在自由文本中包含引号和其他特殊字符,但我发现函数 RMySQL::dbEscapeStrings() 正确处理并转义了它们。 (比自己尝试处理所有特殊情况更好的解决方案)

现在,我需要将数据库迁移到 Microsoft SQL 服务器,我决定使用 odbc 包,因为它与 pool 包兼容。 R 程序包中是否存在可以正确转义要传递给 MSSQL 数据库的字符串的现有函数?

这是我想要复制的行为示例,但使用 Microsoft SQL 服务器数据库而不是 MySQL:

library(RMySQL)

## Create a character vector with some baddies
x <- c("foo ' bar", "blah \" blah ","ugh \0 really","please \% why")

cat(paste0(x, collapse = "\n"))
# foo ' bar
# blah " blah 
# ugh [=12=] really
# please \% why

conn <- RMySQL::dbConnect(RMySQL::MySQL(), dbname = "myDB", host = "127.0.0.1",
                          port = 3306, user = "MyUserName", password = "MyPassword")

cat(paste0(RMySQL::dbEscapeStrings(conn,x), collapse = "\n"))
# foo \' bar
# blah \" blah 
# ugh \0 really
# please \% why

dbDisconnect(conn)

DBI 泛型 dbQuoteString 执行此功能,只是行为与 RMySQL::dbEscapeStrings() 略有不同。

正如预期的那样,转义序列根据数据库略有不同 -- [=14=] 对于 Microsoft SQL 服务器没有任何意义。 user-facing 的主要区别在于 dbQuoteString 将字符向量的每个元素用单引号引起来,而 RMySQL::dbEscapeStrings() 则没有。

由于 odbc 包实现了泛型,odbc::dbQuoteString 将按如下方式工作:

library(odbc)

conn <- odbc::dbConnect(drv = odbc::odbc(),.connection_string = "MyConnectionString")

x <- c("foo ' bar", "blah \" blah ","ugh \0 really","please \% why")

cat(paste0(odbc::dbQuoteString(conn,x), collapse = "\n"))

# 'foo '' bar'
# 'blah " blah '
# 'ugh [=10=] really'
# 'please \% why'

odbc::dbDisconnect(conn)