Почему соединение MySQL игнорирует директиву SET NAMES utf8 в R?

#mysql #r #utf-8 #rmysql

#mysql #r #utf-8 #rmysql

Вопрос:

Я подключился к базе данных MySQL из R и выполнил директиву «set names utf8».

 library(RMySQL)
con<-dbConnect(MySQL(), user='john', password='secret', dbname='awesome', host='myhost')
dbSendQuery(con, "SET NAMES UTF8; ")
  

Обычно это помогает, когда я хочу вернуть данные UTF8 из своих запросов. Однако быстрая проверка показывает, что не все переменные были установлены правильно

 dbGetQuery(con, "SHOW VARIABLES LIKE 'character_set_%'")
#             Variable_name                      Value
#1     character_set_client                     latin1
#2 character_set_connection                     latin1
#3   character_set_database                       utf8
#4 character_set_filesystem                     binary
#5    character_set_results                     latin1
#6     character_set_server                     latin1
#7     character_set_system                       utf8
  

Здесь очевидно, что переменная character_set_client не была установлена. Это также не помогает установить ее явно. На самом деле кажется, что оно полностью игнорирует ее.

 dbSendQuery(con, "SET character_set_client=utf8; ")
dbGetQuery(con, "SHOW VARIABLES LIKE 'character_set_%'")
#             Variable_name                      Value
#1     character_set_client                     latin1
#2 character_set_connection                     latin1
#3   character_set_database                       utf8
#4 character_set_filesystem                     binary
#5    character_set_results                     latin1
#6     character_set_server                     latin1
#7     character_set_system                       utf8
  

Как я могу установить это и заставить соединение возвращать текст в кодировке UTF8? Схема использует кодировку utf8 и параметры сортировки.

Ответ №1:

Происходит рукопожатие, и клиент в конечном итоге сообщает MySQL использовать latin1 . Можно отключить рукопожатие или при первоначальном подключении SET NAMES utf8 .

Смотрите: http://dev.mysql.com/doc/refman/5.6/en/server-options.html#option_mysqld_character-set-client-handshake

Комментарии:

1. Спасибо за ваш ответ и разъяснение, почему это происходит. Однако, как вы можете видеть, я выдаю ‘SET NAMES utf8’ при первоначальном подключении. Но это не помогает… Могу ли я отключить рукопожатие из R?

2. Отключение квитирования — это опция сервера: skip-character-set-client-handshake