【问题标题】:how to encode R strings so that they are read into MySQL without encoding errors如何对 R 字符串进行编码,以便将它们读入 MySQL 而不会出现编码错误
【发布时间】:2017-11-15 16:11:38
【问题描述】:

考虑一下:

> scr<-paste("INSERT INTO ques2_log (freeze_time) value(",sQuote(now()),")")

&gt; scr

#> "INSERT INTO ques2_log (freeze_time) value( ‘2017-06-13 23:46:16’ )"

如果我们将这个简单的 SQL 脚本输入 MySQL 数据库,如下所示:

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 脚本,它可以工作。

也很明显,单引号是意外字符。

我查阅了一些关于字符编码的在线文章并尝试了 enc2utf8(scr) 在通过 RMySQL 命令输入数据库之前。没有效果。同样的错误。

我还阅读了this 并跑了

ALTER DATABASE ques2_log CHARACTER SET utf8 COLLATE utf8_general_ci;

但错误仍然存​​在。

【问题讨论】:

  • 您使用sQuote 而不仅仅是普通的旧单' 有什么原因吗?通常sQuote 用于格式化输出以显示在屏幕上,这不是您在这里所做的。
  • 我正在使用 sQuote 将函数 now() 的输出用单引号括起来。否则很难将函数的输出用单引号括起来,我猜。
  • 你试过paste0("'",date(),"'")吗?
  • 是的!那行得通。我从没想过 sQuote()' 会为同一个输出字符生成两个不同的字符代码!请将其转换为@joran 的答案,我会接受。谢谢。

标签: r encoding utf-8 rmysql


【解决方案1】:

只需使用常规单引号,如:

paste0("'",date(),"'")

sQuote 产生不同的左右“智能”引号,如 ?sQuote 中所述:

通过与适当的单引号或双引号结合使用单引号或双引号文本 左右双引号。

...此外,文档清楚地表明此函数的预期目的是格式化文本以在屏幕上显示面向用户的消息:

函数的目的是提供一种简单的标记方式 用于引用要在 R 输出中使用的文本,例如,在警告或 错误消息。

因此它通常不应该用于处理要以编程方式使用的文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2021-11-01
    • 2023-03-28
    • 2016-01-09
    • 2014-10-18
    • 2012-02-16
    • 1970-01-01
    相关资源
    最近更新 更多