2011-01-11 5 views
3

Ich habe eine Daten mit chinesischen Schriftzeichen als Feldnamen und Daten, ich habe sie aus xls importiert, um auf 2007 zuzugreifen und sie nach ODBC zu exportieren. Dann verwende ich RODBC, um sie in R zu lesen, die Feldnamen sind OK, aber für die Daten werden alle chinesischen Zeichen als ? angezeigt.Wie setzt man Zeichensatz für MySQL in RODBC?

Ich habe die RODBC manual und es wird gesagt lesen:

If it is possible to set the DBMS or ODBC driver to communicate in the character set of the R session then this should be done. For example, MySQL can set the communication character set via SQL, e.g. SET NAMES 'utf8'.

Ich denke, das ist das Problem, aber wie kann ich diesen Befehl MySQL über RODBC zur Verfügung stellen? Vielen Dank!

Antwort

2

Ich bin nicht vertraut mit ODBC und RODBC, aber meine Lektüre des oben Schnipsel der Dokumentation ist, dass SET NAMES 'utf8';SQL dialect Teil von MySQL ist, so dass Sie laufen, dass, wie Sie würde jede andere SQL-Anweisung, die Sie verwenden können Daten aus Ihrer Datenbank abrufen.

So etwas (nicht getestet):

sqlQuery(myChannel, query = "SET NAMES 'utf8';") 

wo myChannel wird die Verbindung durch odbcConnect() zurück Griff.

Gibt es einen Grund, warum Sie RODBC über das RMySQL-Paket verwenden? Ich habe für umfangreiche Datenverarbeitung und den Abruf von komplexen Datensatz alle aus R.

aktualisiert gute Erfahrung mit RMySQL hat: Es gibt someevidence, dass zumindest an einem Punkt, dass SET NAMES deaktiviert wurde im MySQL-ODBC-Treiber. Wenn Sie sicher sind, dass Sie die Zeichen über direkten Zugriff auf die Datenbank lesen können (über mysql oder eines der GUI-Frontends von MySQL), könnten Sie versuchen, das zu replizieren, was SET NAMES tut. Das Folgende ist aus den MySQL manual:

A SET NAMES 'x' statement is equivalent to these three statements: 

SET character_set_client = x; 
SET character_set_results = x; 
SET character_set_connection = x; 

Sie könnten versuchen, diese drei SQL-Anweisungen anstelle von SET NAMES Ausführung und sehen, ob das funktioniert.

Das gleiche Handbuch auch Dokumente SET CHARACTER SET, die in der gleichen Weise wie SET NAMES verwendet werden können:


SET CHARACTER SET charset_name

SET CHARACTER SET ist ähnlich SET NAMES sondern setzt character_set_connection und collation_connection-character_set_database und collation_database. Eine SET CHARACTER SET x Anweisung entspricht diese drei Aussagen:

SET character_set_client = x; 
SET character_set_results = x; 
SET collation_connection = @@collation_database; 

Einstellen collation_connection setzt auch c haracter_set_connection auf den Zeichensatz mit dem zugeordneten Kollation (äquivalent zu der Ausführung SET character_set_connection = @@character_set_database). Es ist nicht erforderlich, character_set_connection explizit festzulegen.


Sie könnten stattdessen SET CHARACTER SET 'utf8' verwenden.

Schließlich, in welchem ​​Zeichensatz/in welcher Ländereinstellung laufen Sie? Es sieht so aus, als ob Sie auf Windows sind - ist das ein UTF8-Gebietsschema? Ich merke auch einige Verwirrung in Ihrem Q. Sie sagen, dass Sie Ihre Daten in MS Access importiert haben, und exportieren Sie es dann in ODBC. Meinst du, du hast es nach MySQL exportiert? Ich dachte, ODBC wäre ein Verbindungstreiber, um die Kommunikation mit/zwischen einer Reihe von Datenbanken zu ermöglichen, nicht etwas, zu dem man "exportieren" könnte.

Sind Sie wirklich Daten in MySQL? Könnten Sie sich nicht über RODBC mit MS Access verbinden, um die Daten von dort zu lesen?

Wenn sich die Daten in MySQL befinden, verwenden Sie das RMySQL-Paket, um eine Verbindung zur Datenbank herzustellen und die Daten zu lesen.

+0

Dank, ich habe es versucht, aber es gibt mir dieses Ergebnis: [1] „42000 543 [MySQL] [ODBC 5.1-Treiber] [mysqld-5.0.67-community-nt] SET NAMES nicht durch den Fahrer erlaubt " [2]" [RODBC] FEHLER: Konnte nicht SQLExecDirect 'SET NAMES' utf8 ';' "' – lokheart

+0

@lokheart - OK, das ** wenn ** am Anfang Ihres Schlüssels ist hier. Es scheint, zumindest für einige Versionen des MySQL ODBC-Treibers, dass 'SET NAMES' im Treiber nicht zulässig ist: http://bugs.mysql.com/bug.php?id=32596 An diesem Punkt müssen Sie möglicherweise nehmen Sie fachliche Beratung von der R-SIG-DB-Mailingliste. Ich schließe einige andere Optionen ein, um eine Aktualisierung der Antwort zu versuchen. Vielleicht möchten Sie auch die Versionen von MySQL, MySQL ODBC-Treiber, RODBC usw., die Sie verwenden, durchsuchen. –

2

Ich habe gerade die Heilung gefunden. Ich weiß nicht, ob ich posten kann.

  1. Richten Sie die MySQL-Datenbank so ein, dass sie auf UTF-8 basiert;

  2. Richten Sie den ODBC-DSN ein und legen Sie die Option "Zeichensatz" NICHT fest.

  3. ch<-odbcConnect("mydb",DBMSencoding="UTF-8");

Das ist es.

+0

ch <-odbcConnect ("mydb", DBMSencoding = "UTF-8") arbeitete für mich .. Danke – Chris