如何对 R 字符串进行编码,以便将它们读入 MySQL 而不会出现编码错误
how to encode R strings so that they are read into MySQL without encoding errors
考虑一下:
> 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 数据库,如下所示:
dbExecute(db,scr1)
MySQL 数据库抛出以下错误: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 脚本并且它有效。
同样清楚单引号是非预期字符。
网上查了一些关于字符编码的文章,试了一下
enc2utf8(scr)
在通过 RMySQL 命令馈送到数据库之前。没有效果。同样的错误。
我还阅读了this和运行
ALTER DATABASE ques2_log CHARACTER SET utf8 COLLATE utf8_general_ci;
但错误依旧。
只需使用常规单引号,如:
paste0("'",date(),"'")
sQuote
产生不同的左右 "smart" 引号,如 ?sQuote
:
中所述
Single or double quote text by combining with appropriate single or
double left and right quotation marks.
...此外,文档清楚地表明此函数的预期目的是格式化文本以在屏幕上显示面向用户的消息:
The purpose of the functions is to provide a simple means of markup
for quoting text to be used in the R output, e.g., in warnings or
error messages.
所以它通常不应该用于处理以编程方式使用的文本。
考虑一下:
> 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 数据库,如下所示:
dbExecute(db,scr1)
MySQL 数据库抛出以下错误: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 脚本并且它有效。
同样清楚单引号是非预期字符。
网上查了一些关于字符编码的文章,试了一下
enc2utf8(scr)
在通过 RMySQL 命令馈送到数据库之前。没有效果。同样的错误。
我还阅读了this和运行
ALTER DATABASE ques2_log CHARACTER SET utf8 COLLATE utf8_general_ci;
但错误依旧。
只需使用常规单引号,如:
paste0("'",date(),"'")
sQuote
产生不同的左右 "smart" 引号,如 ?sQuote
:
Single or double quote text by combining with appropriate single or double left and right quotation marks.
...此外,文档清楚地表明此函数的预期目的是格式化文本以在屏幕上显示面向用户的消息:
The purpose of the functions is to provide a simple means of markup for quoting text to be used in the R output, e.g., in warnings or error messages.
所以它通常不应该用于处理以编程方式使用的文本。