Извлечение текста UTF-8 из MySQL в R возвращает "????"
Я застрял, пытаясь получить текст UTF-8 в базе данных MySQL из R. Я запускаю R на OS X (пробовал как через GUI, так и из командной строки), где языковой стандарт по умолчанию - en_US.UTF-8, и нет независимо от того, что я пытаюсь, результат запроса показывает "?" для всех не-ASCII символов.
Я пытался установить options(encoding='UTF-8')
, DBMSencoding='UTF-8'
при подключении через ODBC, настройка Encoding(res$str) <- 'UTF-8'
после получения результатов, а также вариантов utf8 каждого из них, все безрезультатно. Выполнение запроса из командной строки mysql клиент показывает правильно результаты.
Я полностью в тупике. Любые идеи, почему это не работает, или другие вещи, которые я должен попробовать?
Вот довольно минимальный тестовый пример:
$ 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)
Запрос к таблице в R с использованием RODBC и RMySQL показывает "?????" для столбца 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 ?????
Для полноты вот мое 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
3 ответа
Благодаря @chooban я узнал, что в сеансе соединения использовался latin1 вместо utf8. Вот два решения, которые я нашел:
- Для RMySQL после подключения запустите запрос
SET NAMES utf8
изменить набор символов подключения. - Для RODBC подключитесь с помощью
CharSet=utf8
в строке DSN. Я не смог бежатьSET NAMES
через ODBC.
Этот вопрос направил меня в правильном направлении.
Это сработало для меня. Вот полный пример:
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")
Вот кое-что, чтобы попробовать по крайней мере. После подключения запустите "SHOW VARIABLES LIKE 'character_set_%'" и распечатайте результаты. Если ничего другого, это полезная проверка, чтобы убедиться, что выбранные вами опции набора символов приняты.