Как изменить кодировку соединения dplyr::tbl на utf8?

В базе MySQL таблица закодирована в utf8, но соединение почему-то в latin1.

res <- RMySQL::dbSendQuery(con,"show variables like 'character_set_%'")
dbFetch(res)
           Variable_name                      Value
1     character_set_client                     latin1
2 character_set_connection                     latin1
3   character_set_database                    utf8mb4
4 character_set_filesystem                     binary
5    character_set_results                     latin1
6     character_set_server                     latin1
7     character_set_system                       utf8
8       character_sets_dir /usr/share/mysql/charsets/

На этой странице объясняется, как установить набор символов соединения на utf8 с помощью RMySQL.

RMySQL::dbGetQuery(con,"show variables like 'character_set_%'")
RMySQL::dbGetQuery(con,"set names utf8")

Но на самом деле я предпочитаю использовать dplyr::tbl для запросов к базе данных. Поскольку соединение, созданное dplyr::src_mysql, имеет возможность отправлять только операторы sql, которые создают таблицы. Как dplyr установить настройку подключения для использования кодировки utf8?


person Paul Rougieux    schedule 19.06.2015    source источник
comment
Вы видели это? stackoverflow.com/questions/25934752 /   -  person Roman Luštrik    schedule 19.06.2015
comment
@RomanLuštrik Я видел это, спасибо, я также конвертирую столбцы символов в utf8, используя специальное решение с iconv(), но это хак, и я бы предпочел читать векторы символов непосредственно в utf8. Тем более, что база уже в utf8.   -  person Paul Rougieux    schedule 19.06.2015
comment
Я чувствую твою боль. Кодирование — это проклятие для всех, кто работает с данными, отличными от latin1.   -  person Roman Luštrik    schedule 20.06.2015
comment
Я фактически исправил это, изменив настройки конфигурации сервера базы данных на utf8 и выбрав опцию skip-character-set-client в /etc/mysql/my.cf.   -  person Paul Rougieux    schedule 24.06.2015


Ответы (2)


Я столкнулся с той же проблемой, которую я решил следующим образом:

foo_db <- src_mysql(host='0.0.0.0',user='dbuser',password='a_password',
                    dbname='FlightTimes',port=3336)
dbGetQuery(foo_db$con,'SET NAMES utf8')

Я обнаружил, что это возможно, посмотрев на структуру foo_db через str(foo_db), увидев наличие атрибута con класса MySQLConnection, а затем применив вашу мантру dbGetQuery.

person shabbychef    schedule 07.01.2016

Отредактируйте файл параметров сервера (расположенный в /etc/mysql/my.cnf в системе Debian) и добавьте следующие параметры:

collation-server = utf8_unicode_ci
character-set-server = utf8
skip-character-set-client-handshake

Файл конфигурации сервера mysql также можно редактировать с помощью mysql-workbench.

После этого изменения dplyr::tbl извлекает вектор символов, закодированный в utf-8.

person Paul Rougieux    schedule 24.06.2015