如何正确设置变量 (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 中的客户端,那么您可能必须坚持使用该字符集。
我遇到了 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 中的客户端,那么您可能必须坚持使用该字符集。