Проблемы кодирования R и MySQL

0

Похоже, я открыл еще одну главу кодировки из адской книги. Я обращаюсь за помощью к проблеме, с которой я сталкиваюсь, когда вытаскиваем и записываем данные из\в базу данных 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
Теги:
encoding
dbplyr
rmysql

1 ответ

0

Не используйте какие-либо функции преобразования, это, вероятно, еще хуже.

¨ является Mojibake для ¨ и ° для °. Поскольку я вижу A перед каждым из них, я думаю, вы пытаетесь ввести акцентированный A, сначала набрав A, затем акцент. Однако ваш инструмент ввода данных не может их комбинировать. Какой редактор вы используете?

(Да, вы "открыли еще одну главу кодировки из адской книги" - я видел много проблем с набором символов, но не до сих пор.)

  • 0
    Спасибо, что заглянули в это. Что вы имеете в виду под каким редактором? Использование MySQL Workbench и R. Я предполагаю, что кодирование в БД уже испорчено
  • 0
    Каковы ключевые клавиши для Ä ?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню