Подтвердить что ты не робот

Извлечение текста 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 ?????

Для полноты здесь my 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 
4b9b3361

Ответ 1

Благодаря @chooban, я узнал, что сеанс подключения использует latin1 вместо utf8. Вот два найденных решения:

  • Для RMySQL после подключения запустите запрос SET NAMES utf8, чтобы изменить набор символов соединения.
  • Для RODBC подключитесь с помощью CharSet=utf8 в строке DSN. Я не смог запустить SET NAMES через ODBC.

Этот вопрос указал мне в правильном направлении.

Ответ 2

Здесь что-то попробовать хотя бы. После того, как вы подключились, запустите "SHOW VARIABLES LIKE" character_set_% '"и распечатайте результаты. Если ничто иное не является полезной проверкой, чтобы увидеть, были ли заданы параметры набора символов, которые вы указали.

Ответ 3

Это сработало для меня. Вот полный пример:

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")