考虑一下:
> scr<-paste("INSERT INTO ques2_log (freeze_time) value(",sQuote(now()),")")
> scr
#> "INSERT INTO ques2_log (freeze_time) value( ‘2017-06-13 23:46:16’ )"
如果我们将这个简单的SQL脚本提供给MySQL DB,如下所示:
dbExecute(db,scr1)
MySQL DB会抛出以下错误:Error in .local(conn, statement, ...) : could not run statement: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '��2017-06-13 23:44:13’ )' at line 1
我已经通过手动输入来测试SQL脚本并且它可以正常工作。
同样清楚的是,单引号是意外的字符。
我查了一些关于字符编码的在线文章并尝试过
在通过RMySQL命令提供给DB之前enc2utf8(scr)
。没有效果。同样的错误。
我还阅读this并运行
ALTER DATABASE ques2_log CHARACTER SET utf8 COLLATE utf8_general_ci;
但错误仍然存在。
答案 0 :(得分:1)
只需使用常规单引号,如:
paste0("'",date(),"'")
sQuote
产生明显的左右和#34;智能&#34;引号,如?sQuote
中所述:
单引号或双引号文本,结合适当的单词或 双左右引号。
...此外,文档清楚地表明此功能的目的是格式化文本以在屏幕上显示面向用户的消息:
这些功能的目的是提供一种简单的标记方法 用于引用要在R输出中使用的文本,例如,在警告或中 错误消息。
因此,通常不应该使用它来处理要以编程方式使用的文本。