如何正确设置变量 (character_set_%) 以便从 R 中的 MySQL 读取正确的西里尔字母

How to Properly Set Variables (character_set_%) for Proper Cyrillic Leters Reading from MySQL in R

我遇到了 MySQL table.

中的西里尔字母读取不正确的问题

我使用以下代码:

library(RMySQL)
library(keyring)

mydb = dbConnect(MySQL(), ...)
dbReadTable(mydb, 'tregions2')

读取了 table 但西里尔字母被问号代替:

  id     regionname  iSOID administrativeCenter
1  1 ????????? ???? RU-ALT              ???????

我开始调查这个问题。

MySQL Workbench 中同一用户在同一台​​ PC 上登录的查询结果 show variables like 'character_set_%'; returns:

character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database  utf8
character_set_filesystem    binary
character_set_results   utf8mb4
character_set_server    utf8mb4
character_set_system    utf8
character_sets_dir  C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\

但是R返回的查询结果不同:

> dbGetQuery(mydb, "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                                                       utf8mb4
7     character_set_system                                                          utf8
8       character_sets_dir C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\

R语言环境变量如下:

> Sys.getlocale()
[1] "LC_COLLATE=Russian_Russia.1251;LC_CTYPE=Russian_Russia.1251;LC_MONETARY=Russian_Russia.1251;LC_NUMERIC=C;LC_TIME=Russian_Russia.1251

我试图更改数据库中 table 的字符集和排序规则。早些时候设置 cp1251 字符集帮助我正确地将数据写入数据库。但是不是现在。我试过 utf8/koi8r/cp1251 没有任何效果。

尝试执行 Sys.setlocale(,"ru_RU") 因无法执行的错误而中止。

我卡住了。谁能给我建议我还应该做什么?

经过几个小时的调查,我终于找到了解决办法。希望它能帮助遇到同样问题的人:

> dbExecute(mydb, "SET NAMES cp1251")
[1] 0
> dbGetQuery(mydb, "show variables like 'character_set_%'")
             Variable_name                                                         Value
1     character_set_client                                                        cp1251
2 character_set_connection                                                        cp1251
3   character_set_database                                                          utf8
4 character_set_filesystem                                                        binary
5    character_set_results                                                        cp1251
6     character_set_server                                                       utf8mb4
7     character_set_system                                                          utf8
8       character_sets_dir C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\
> 
> TrTMP <- dbReadTable(mydb, 'tregions')
> TrTMP[1,c(1,2,6,14)]
  id     regionname  iSOID administrativeCenter
1  1 Алтайский край RU-ALT              Барнаул
Tool -> Global Options -> Code -> Saving and put UTF-8
rs <- dbSendQuery(con, 'set character set "utf8"')
rs <- dbSendQuery(con, 'SET NAMES utf8')

我调用我的包的主脚本顶部的选项(编码=“UTF-8”)似乎解决了我的包代码中包含非ascii字符的问题。

read_chunk(lines = readLines("TestSpanishText.R", encoding = "UTF-8")) (also file())

为了更灵活,您应该使用 utf8mb4 而不是 cp1251。如果您有数据进入 cp1251 中的客户端,那么您可能必须坚持使用该字符集。