2012-10-13 6 views
26

Sono bloccato cercando di recuperare testo UTF-8 in un database MySQL da R. Sto eseguendo R su OS X (provato sia tramite la GUI che dalla riga di comando), dove la locale predefinita è en_US.UTF-8, e indipendentemente da ciò che provo, il risultato della query mostra "?" per tutti i caratteri non ASCII.Il recupero del testo UTF-8 da MySQL in R restituisce "????"

Ho provato a installare options(encoding='UTF-8'), DBMSencoding='UTF-8' quando si collegano tramite ODBC, impostazione Encoding(res$str) <- 'UTF-8' dopo il recupero dei risultati, così come le varianti 'utf8' di ciascuno di questi, tutto inutile. L'esecuzione della query dal client mysql della riga di comando mostra correttamente i risultati.

Sono totalmente perplesso. Qualche idea sul perché non funziona o su altre cose che dovrei provare?

Ecco un test piuttosto limitata:

$ mysql -u root 
mysql> CREATE DATABASE test; 
mysql> USE test; 
mysql> CREATE TABLE test (str VARCHAR(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
Query OK, 0 rows affected (0.02 sec) 

mysql> INSERT INTO test (str) VALUES ('こんにちは'); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from test; 
+-----------------+ 
| str    | 
+-----------------+ 
| こんにちは  | 
+-----------------+ 
1 row in set (0.00 sec) 

Interrogazione tabella R utilizzando entrambi gli spettacoli RODBC e RMySQL "?????" per la colonna str:

> con <- odbcDriverConnect('DRIVER=mysql;user=root', DBMSencoding='UTF-8') 
> sqlQuery(con, 'SELECT * FROM rtest.test') 
    str 
1 ????? 
> library(RMySQL) 
Loading required package: DBI 
> con <- dbConnect(MySQL(), user='root') 
> dbGetQuery(con, 'SELECT * FROM rtest.test') 
    str 
1 ????? 

Per completezza, ecco la mia sessionInfo:

> sessionInfo() 
R version 2.15.1 (2012-06-22) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RMySQL_0.9-3 DBI_0.2-5 RODBC_1.3-6 

risposta

26

Grazie a @chooban ho scoperto che la sessione di connessione utilizzava latin1 invece di utf8. Ecco due soluzioni che ho trovato:

  • Per RMySQL, dopo aver eseguito la connessione eseguire la query SET NAMES utf8 per modificare il set di caratteri di connessione.
  • Per RODBC, collegare utilizzando CharSet=utf8 nella stringa DSN. Non ero in grado di eseguire SET NAMES tramite ODBC.

This question mi ha indirizzato nella giusta direzione.

5

Ecco qualcosa da provare almeno. Dopo esserti connesso, esegui "MOSTRA VARIABILI COME" character_set_% "" e stampa i risultati. Se non altro è un controllo utile per vedere se le opzioni di set di caratteri che hai specificato hanno preso.

+0

Buona chiamata. Abbastanza sicuro tutte le variabili rilevanti di set di caratteri mostrano "latin1". Ho capito una soluzione che posterò separatamente. –

0

Questo ha funzionato per me. Ecco un esempio completo:

con = dbConnect(drv = MySQL(), user = user, password = password, 
       dbname = dbname, host=host) 

dbSendQuery(con, "SET NAMES utf8mb4;") 
dbSendQuery(con, "SET CHARACTER SET utf8mb4;") 
dbSendQuery(con, "SET character_set_connection=utf8mb4;") 


dbGetQuery(con, "SELECT * FROM WHATEVER")