与Microsoft SQL Server数据库的RMySQL :: dbEscapeStrings()等效

时间:2019-07-16 14:47:17

标签: r odbc

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

现在,我需要将数据库迁移到Microsoft SQL Server,并且由于它与odbc包兼容,因此决定使用pool包。 R包中是否有一个现有函数,可以正确地转义字符串以传递给MSSQL数据库?

以下是我要复制的行为的示例,但是使用Microsoft SQL Server数据库而不是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 \0 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)

1 个答案:

答案 0 :(得分:0)

DBI通用dbQuoteString执行此功能,其行为与RMySQL::dbEscapeStrings()略有不同。

按预期,转义序列因数据库而略有不同-\0对Microsoft SQL Server没有任何意义。面向用户的主要区别是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 \0 really'
# 'please \% why'

odbc::dbDisconnect(conn)