Как установить кодировку для MySQL в RODBC? - PullRequest
3 голосов
/ 11 января 2011

У меня есть данные с китайскими символами в качестве имен полей и данных, я импортировал их из xls для доступа к 2007 и экспортировал их в ODBC.Затем я использую RODBC для чтения их в R, с именами полей все в порядке, но для данных все китайские символы показаны как ?.

Я прочитал руководство RODBC и он сказал:

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'.

Я полагаю, что это проблема, но как я могу предоставить эту команду MySQL через RODBC?Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 апреля 2012

Я только что нашел лекарство.Не знаю, могу ли я публиковать сообщения.

  1. Настройка базы данных MySQL на основе UTF-8;

  2. Настройка DSBC ODBCи НЕ устанавливайте опцию «набор символов».

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

Вот и все.

2 голосов
/ 11 января 2011

Я не знаком с ODBC и RODBC, но мое прочтение приведенного выше фрагмента документации состоит в том, что SET NAMES 'utf8'; является частью MySQL диалекта SQL , поэтому запустите его так же, как любой другой оператор SQL, который вы можете использовать для извлечения данных из вашей базы данных.

Что-то вроде (не проверено):

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

где myChannel - дескриптор соединения, возвращаемый odbcConnect().

Есть ли причина, по которой вы используете RODBC поверх пакета RMySQL? У меня был хороший опыт использования RMySQL для обширной обработки данных и извлечения сложных наборов данных в пределах R.

Обновление: Есть некоторые свидетельства , что, по крайней мере, в один момент, что SET NAMES было деактивировано в драйвере ODBC MySQL. Если вы уверены, что можете читать символы через прямой доступ к базе данных (через mysql или через один из интерфейсов MySQL с графическим интерфейсом), то вы можете попытаться повторить то, что делает SET NAMES. Следующее из руководства MySQL :

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;

Вы можете попробовать выполнить эти три оператора SQL вместо SET NAMES и посмотреть, работает ли это.

В том же руководстве также документируется SET CHARACTER SET, который можно использовать так же, как и SET NAMES:


SET CHARACTER SET charset_name

SET CHARACTER SET аналогично SET NAMES, но устанавливает character_set_connection и collation_connection на character_set_database и collation_database. SET CHARACTER SET x оператор эквивалентен этим трем операторам:

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

Установка collation_connection также устанавливает c haracter_set_connection на набор символов, связанный с сопоставлением (эквивалентно выполнению SET character_set_connection = @@character_set_database). Нет необходимости устанавливать character_set_connection явно.


Вместо этого вы можете попробовать SET CHARACTER SET 'utf8'.

Наконец, в каком наборе символов / локали вы работаете? Похоже, вы находитесь на Windows - это локаль UTF8? Я также отмечаю некоторую путаницу в вашем вопросе. Вы говорите, что импортировали свои данные в MS Access, а затем экспортировали их в ODBC. Вы имеете в виду, что вы экспортировали его в MySQL? Я думал, что ODBC был драйвером соединения, позволяющим осуществлять связь с / между целым рядом баз данных, а не чем-то, что вы могли бы «экспортировать».

Действительно ли вы данные в MySQL? Не могли бы вы подключиться к MS Access через RODBC для чтения данных оттуда?

Если данные находятся в MySQL, попробуйте использовать пакет RMySQL для подключения к базе данных и чтения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...