Holen UTF-8-text aus MySQL in R gibt "????"
Ich bin stecken, versuchen zu Holen UTF-8-text in eine MySQL-Datenbank von R., ich bin mit R on OS X (habe versucht, sowohl über das GUI und Befehl Linie), wo der Standard-locale en_US.UTF-8, und egal was ich versuche, das Ergebnis der Abfrage zeigt "?", für alle nicht-ASCII-Zeichen.
Ich habe versucht Einstellung options(encoding='UTF-8')
, DBMSencoding='UTF-8'
wenn die Verbindung über ODBC Einstellung Encoding(res$str) <- 'UTF-8'
nach dem abrufen der Ergebnisse, sowie 'utf8' Varianten von jedem von denen, alles ohne Erfolg. Ausführen der Abfrage über die Befehlszeile mysql-client zeigt die Ergebnisse korrekt.
Bin ich Total überfragt. Irgendwelche Ideen, warum es nicht funktioniert, oder andere Dinge, die ich versuchen sollte?
Hier ist ein ziemlich minimaler Testfall:
$ 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)
Abfragen der Tabelle in R mit beiden RODBC und RMySQL zeigt "?????" für die str-Spalte:
> 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 ?????
Vollständigkeit halber, hier mein 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank @chooban fand ich heraus, die Sitzung war mit latin1 statt utf8. Hier sind zwei Lösungen habe ich gefunden:
SET NAMES utf8
zum ändern der Verbindung Zeichensatz.CharSet=utf8
in der DSN-string. Ich war nicht in der Lage zu laufenSET NAMES
über ODBC.Diese Frage wies mich in die richtige Richtung.
Hier ist etwas zu versuchen zumindest. Nachdem Sie angeschlossen haben, führen Sie "SHOW VARIABLEN WIE 'character_set_%'" und drucken Sie die Ergebnisse. Wenn nichts anderes, es ist eine nützliche überprüfen Sie, ob der Zeichensatz-Optionen, die Sie angegeben haben, genommen haben.
Dieser arbeitete für mich. Hier ist ein vollständiges Beispiel: