【问题标题】:Encoding issues R and MySQL编码问题 R 和 MySQL
【发布时间】:2018-08-20 21:42:47
【问题描述】:

好像我从地狱书打开了编码的另一章。我在使用 R 从 MySQL 数据库中提取和写入数据时遇到的问题寻求帮助。经过很长一段时间后,我能够写回我的数据,但仍然不明白到底发生了什么。

library(RMySQL)
library(dbplyr)

con <- dbConnect(MySQL(), 
         host = "localhost",
         user = "root",
         dbname="test",
         password = rstudioapi::askForPassword("Database password"))

address <- as_tibble(tbl(con, "address")) 

拉取的address 数据框看起来像

address <- structure(list(address_id = c(1809463, 2213341, 2614879, 4536353
), street = c("5, RUE DU GRAND CORMORAN APPT. C15", "14, PLACE EGLISE", 
"1058 TENNESSEE", "38 ALLEE GERARD DE NERVAL"), city = c("31240 L A°NION", 

"85140 L AÂIE", "ELK GROVE VILLAGE A¨LLINOIS 60007", "F-69360 SAINT-
SYPHORIEN D AÂZON"
)), .Names = c("address_id", "street", "city"), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))

您可以立即看到address$city 中存在一些编码问题,所以我运行

address$city <-  iconv(address$city, from = "UTF-8", "windows-1252")

这似乎可以解决它,因为现在一切看起来都很好,但是一旦我想将文件写回 MySQL,我又遇到了编码问题,再次出现以下错误

dbWriteTable(con, value =address, name = "address_cleaned", overwrite=TRUE ,rownames = FALSE ) 

.local(conn, statement, ...) 中的错误: 无法运行语句:无效的 utf8 字符串:'31240 L A'

我现在做的事情解决了这个问题,但我真的不明白发生了什么。

Encoding(address$city) <- 'UTF-8'
address$city <-  iconv(address$city, from =  "windows-1252","UTF-8")
address$city <-  iconv(address$city, from =  "latin1","UTF-8")

虽然此代码有效,但它似乎更像是一种变通方法,而不是真正的解决方案。我确信这与 MySQL 数据的编码以及作为我的操作系统的 Windows 有关,但我想知道是否有更优雅的解决方案。

其他信息

dbGetQuery(con, "SHOW VARIABLES LIKE 'character_set_%';")
             Variable_name                                                         Value
1     character_set_client                                                          utf8
2 character_set_connection                                                          utf8
3   character_set_database                                                          utf8
4 character_set_filesystem                                                        binary
5    character_set_results                                                          utf8
6     character_set_server                                                          utf8
7     character_set_system                                                          utf8
8       character_sets_dir C:\\Program Files\\MySQL\\MySQL Server 5.7\\share\\charsets\\

Sys.getlocale()
[1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"

编辑 1. 十六进制

1809463 31240 L A°NION  3331323430204C2041C2B04E494F4E
2213341 85140 L AIE 3835313430204C2041C2904945
2614879 ELK GROVE VILLAGE A¨LLINOIS 60007   454C4B2047524F56452056494C4C4147452041C2A84C4C494E4F4953203630303037
4536353 F-69360 SAINT-SYPHORIEN D AZON  462D3639333630205341494E542D535950484F5249454E20442041C2905A4F4E

【问题讨论】:

    标签: mysql r encoding rmysql dbplyr


    【解决方案1】:

    不要使用任何转换函数,这可能会使事情变得更糟。

    ¨¨ 的 Mojibake 和 °Â°。因为我在每个前面都看到了A,所以我猜你是在尝试输入带重音的A,首先输入A,然后输入重音。但是,您的数据输入工具无法将这些结合起来。你用的是什么编辑器?

    (是的,你已经“从地狱书打开了编码的另一章”——我见过很多字符集问题,但直到现在还没有这个。)

    【讨论】:

    • 感谢您的调查。什么编辑器是什么意思?使用 MySQL Workbench 和 R。我的猜测是 DB 中的编码在某种程度上已经搞砸了
    • Ä 的按键是什么?
    • 我没有做任何数据输入,所以我不能说。我基本上得到了数据库,并尝试用 R 清理它以用于进一步分析。在这样做时,我偶然发现了那个编码问题
    • 然后执行SELECT HEX(col) ... 这样我们就可以看到实际存在的内容。
    • 奇怪的东西。正文应该说什么?我看到名为L'Union 的城市,但我看不出撇号如何变成你所看到的。 Illinois 同上。无论如何,我很确定数据在插入之前或之前是乱码的。对设置的任何更改都无法正确显示。
    猜你喜欢
    • 2012-02-21
    • 2013-04-25
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多