Похоже, я открыл еще одну главу кодировки из адской книги. Я обращаюсь за помощью к проблеме, с которой я сталкиваюсь, когда вытаскиваем и записываем данные из\в базу данных MySQL с R. После достаточного количества времени я смог записать свои данные, но до сих пор не понимаю, что именно происходит.
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. hex
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
, затем акцент. Однако ваш инструмент ввода данных не может их комбинировать. Какой редактор вы используете?
(Да, вы "открыли еще одну главу кодировки из адской книги" - я видел много проблем с набором символов, но не до сих пор.)
Ä
?