好像我又翻开了 hell 编码这本书的另一章。我在使用 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 <- 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 )
Error in .local(conn, statement, ...) : could not run statement: Invalid utf8 character string: '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
最佳答案
不要使用任何转换函数,它可能会让事情变得更糟。
¡
是 ¡
的 Mojibake,°
是 °
的 °
。由于我在每个字符之前都看到 A
,我猜您正在尝试通过先键入 A
,然后键入重音来输入带重音的 A
。但是,您的数据输入工具无法将这些结合起来。您使用什么编辑器?
(是的,你已经“翻开了 hell 编码书的另一章”——我见过很多字符集问题,但到目前为止还没有看到这个。)
关于mysql - R 和 MySQL 的编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49242541/