如何正确设置character_set_%变量实现R读取MySQL中的西里尔字符
解决方案
问题根源是R连接MySQL时会话默认使用latin1作为客户端、连接、返回结果的字符集,和数据库实际存储的字符集不匹配,可按以下方案依次尝试:
- 连接时显式指定字符集:RMySQL的
dbConnect方法支持直接传入字符集参数,在连接代码中增加default.character.set配置即可:
library(RMySQL) library(keyring) # 连接时增加字符集参数 mydb = dbConnect(MySQL(), ..., default.character.set = 'utf8mb4') dbReadTable(mydb, 'tregions2')
- 连接后手动执行字符集初始化语句:如果连接时指定参数不生效,可以在建立连接后立刻执行
SET NAMES语句批量修改会话字符集,匹配Workbench的配置:
mydb = dbConnect(MySQL(), ...) # 执行SET NAMES修改当前会话的client/connection/results字符集 dbExecute(mydb, "SET NAMES utf8mb4;") dbReadTable(mydb, 'tregions2')
- 读取后手动转码:如果上述配置都不生效,可以在拿到查询结果后,对字符列手动转码,适配你当前的Windows系统编码:
df <- dbReadTable(mydb, 'tregions2') # 两种转码方向可分别测试 # 方向1:从utf8转为系统默认的cp1251 df$regionname <- iconv(df$regionname, from = "UTF-8", to = "CP1251") # 方向2:修复被误识别为latin1的utf8字符 df$regionname <- iconv(df$regionname, from = "LATIN1", to = "UTF-8")
- 更换连接驱动:RMySQL已经停止维护多年,对新MySQL版本和字符集的适配存在缺陷,可以改用官方更推荐的
RMariaDB包,语法几乎和RMySQL完全兼容,字符集处理更稳定:
# 先执行安装 install.packages("RMariaDB") library(RMariaDB) mydb = dbConnect(MariaDB(), ...) dbReadTable(mydb, 'tregions2')
- 修正locale设置语法:你之前执行
Sys.setlocale(,"ru_RU")报错是因为参数不完整,Windows系统下需要写完整的locale名称:
# 完整设置语法 Sys.setlocale("LC_ALL", "Russian_Russia.1251")
内容的提问来源于stack exchange,提问作者asd-tm
相关产品推荐
相关产品推荐

