2015-06-19 19 views
5

In un database MySQL, una tabella è codificata in utf8, ma per qualche motivo la connessione è in latin1.Come modificare la codifica della connessione dplyr :: tbl su utf8?

res <- RMySQL::dbSendQuery(con,"show variables like 'character_set_%'") 
dbFetch(res) 
      Variable_name      Value 
1  character_set_client      latin1 
2 character_set_connection      latin1 
3 character_set_database     utf8mb4 
4 character_set_filesystem      binary 
5 character_set_results      latin1 
6  character_set_server      latin1 
7  character_set_system      utf8 
8  character_sets_dir /usr/share/mysql/charsets/ 

This page explain how to set the connection's character set to utf8 using RMySQL.

RMySQL::dbGetQuery(con,"show variables like 'character_set_%'") 
RMySQL::dbGetQuery(con,"set names utf8") 

Ma io in realtà preferiscono utilizzare il dplyr::tbl per interrogare il database. Poiché la connessione creata da dplyr::src_mysql ha solo la possibilità di inviare istruzioni SQL che creano tabelle. Qual è il modo dplyr per impostare le impostazioni di connessione per utilizzare la codifica utf8?

+0

Hai visto questo? http://stackoverflow.com/questions/25934752/utf-8-encoding-with-dplyr-and-sqlite –

+0

@ RomanLuštrik L'ho visto grazie, converto anche colonne di caratteri in utf8 usando una soluzione ad-hoc con ' iconv() 'ma è un hack e preferisco leggere i vettori di caratteri direttamente in utf8. Soprattutto perché il database è già in utf8. –

+0

Sento il tuo dolore. La codifica è un pericolo per chiunque lavori con dati non latini1. –

risposta

1

modificare il file delle opzioni del server (che si trova in /etc/mysql/my.cnf su un sistema Debian) e aggiungere le seguenti opzioni:

collation-server = utf8_unicode_ci 
character-set-server = utf8 
skip-character-set-client-handshake 

Il file di configurazione del server MySQL può anche essere modificato con mysql banco di lavoro.

Dopo questa modifica, dplyr::tbl recupera il vettore di caratteri codificato in utf-8.

2

Ho incontrato lo stesso problema, che ho risolto come segue:

foo_db <- src_mysql(host='0.0.0.0',user='dbuser',password='a_password', 
        dbname='FlightTimes',port=3336) 
dbGetQuery(foo_db$con,'SET NAMES utf8') 

Ho trovato questo è stato possibile, cercando in struttura del foo_db via str(foo_db), vedendo c'era un attributo con di classe MySQLConnection, poi applicare il tuo mantra dbGetQuery.

Problemi correlati