Phi*_*ipp 4 regex mysql sql r escaping
我正在使用 RMySQL 将一些 html 代码写入 SQL 数据库(但我想我的问题是一个通用的 R 问题,而不是真正与 SQL 或 RMySQL 相关的问题)。所以我正在尝试这样的事情:
con <- RMySQL(...) # some connection
html <- "<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>"
query <- c('INSERT INTO table (htmlfield) VALUES (\"', html, '"')
dbSendQuery(con,paste(query, collapse = ""))
Run Code Online (Sandbox Code Playgroud)
麻烦的是,R 的粘贴会将单引号中的双引号(即 '"')替换为转义序列 \",即:
> paste(query, collapse = "")
[1] "INSERT INTO table (htmlfield) VALUES (\"<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>\""
Run Code Online (Sandbox Code Playgroud)
如果我将向量查询中的单引号更改为双引号,将 html 中的单引号更改为双引号,那么问题就出在字符串 html 的一侧,此后 html 中的双引号被转义序列替换。
处理转义字符替换的最简单方法是什么?
我尝试了gsub('\\\"','"',html)哪些没有按预期工作,并且在忽略 R 字符串中的转义字符(反斜杠)一文中提出了解决方案,但我无法使其工作。
感谢您的关注,菲利普
我看到您在问题中包含的内容有两个问题。第一个看起来像一个错字。后:
html <- "<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>"
Run Code Online (Sandbox Code Playgroud)
你有:
query <- c('INSERT INTO table (htmlfield) VALUES (\"', html, '"')
^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
请注意,您转义了一个字符串而不是另一个。你不需要逃避他们,但如果你这样做也没关系。您还指'")'的是最后一个字符串,我怀疑这是您遇到的错误的真正来源。paste而不是c在这里更有用。如果我结合这些,我们得到:
query <- paste('INSERT INTO table (htmlfield) VALUES ("', html, '")', sep = "")
Run Code Online (Sandbox Code Playgroud)
我们可以直接使用:
dbSendQuery(con, query)
Run Code Online (Sandbox Code Playgroud)
第二个问题,也是很多人遇到的问题,是将对象的印刷表示与对象本身混淆。如果我们打印query,我们会看到:
> query
[1] "INSERT INTO table (htmlfield) VALUES (\"<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>\")"
Run Code Online (Sandbox Code Playgroud)
字符串的打印表示总是用""双引号括起来,因此"需要对内部进行转义。您要查看的是实际字符串。我们可以用cator做到这一点writeLines- 我更喜欢后者,因为它会"\n"自动将 the 添加到字符串的末尾:
> writeLines(query)
INSERT INTO table (htmlfield) VALUES ("<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>")
Run Code Online (Sandbox Code Playgroud)
注意"现在是如何不被转义的。这是将由数据库服务器执行的 SQL。如果这是您的数据库的有效 SQL,那么它将起作用。