我编写了一个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)
答案 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)