在 R 中从 MySQL 获取 UTF-8 文本返回“????”

Posted

技术标签:

【中文标题】在 R 中从 MySQL 获取 UTF-8 文本返回“????”【英文标题】:Fetching UTF-8 text from MySQL in R returns "????" 【发布时间】:2012-10-03 21:37:56 【问题描述】:

我一直在尝试从 R 获取 mysql 数据库中的 UTF-8 文本。我在 OS X 上运行 R(通过 GUI 和命令行都尝试过),其中默认语言环境是 en_US.UTF-8 ,无论我怎么尝试,查询结果都显示“?”对于所有非 ASCII 字符。

我尝试在通过 ODBC 连接时设置options(encoding='UTF-8')DBMSencoding='UTF-8',在获取结果后设置Encoding(res$str) <- 'UTF-8',以及每一个的“utf8”变体,但均无济于事。从命令行 mysql 客户端运行查询可以正确显示结果。

我完全被难住了。有什么想法为什么它不起作用,或者我应该尝试其他的方法吗?

这是一个相当简单的测试用例:

$ mysql -u root
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE test (str VARCHAR(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO test (str) VALUES ('こんにちは');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+-----------------+
| str             |
+-----------------+
| こんにちは      |
+-----------------+
1 row in set (0.00 sec)

同时使用 RODBC 和 RMySQL 查询 R 中的表显示“?????”对于 str 列:

> con <- odbcDriverConnect('DRIVER=mysql;user=root', DBMSencoding='UTF-8')
> sqlQuery(con, 'SELECT * FROM rtest.test')
    str
1 ?????
> library(RMySQL)
Loading required package: DBI
> con <- dbConnect(MySQL(), user='root')
> dbGetQuery(con, 'SELECT * FROM rtest.test')
    str
1 ?????

为了完整起见,这是我的 sessionInfo:

> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RMySQL_0.9-3 DBI_0.2-5    RODBC_1.3-6 

【问题讨论】:

【参考方案1】:

这对我有用。这是一个完整的例子:

con = dbConnect(drv = MySQL(), user = user, password = password,
                dbname = dbname, host=host)

dbSendQuery(con, "SET NAMES utf8mb4;")
dbSendQuery(con, "SET CHARACTER SET utf8mb4;")
dbSendQuery(con, "SET character_set_connection=utf8mb4;")


dbGetQuery(con, "SELECT * FROM WHATEVER")

【讨论】:

【参考方案2】:

感谢@chooban,我发现连接会话使用的是 latin1 而不是 utf8。以下是我找到的两个解决方案:

对于 RMySQL,连接后运行查询 SET NAMES utf8 以更改连接字符集。 对于 RODBC,使用 DSN 字符串中的CharSet=utf8 进行连接。我无法通过 ODBC 运行 SET NAMES

This question 为我指明了正确的方向。

【讨论】:

【参考方案3】:

至少可以尝试一下。连接后,运行“SHOW VARIABLES LIKE 'character_set_%'”并打印出结果。如果不出意外,检查您指定的字符集选项是否已采用是一个有用的检查。

【讨论】:

好电话。果然所有相关的字符集变量都显示“latin1”。想出了一个解决方案,我将单独发布。

以上是关于在 R 中从 MySQL 获取 UTF-8 文本返回“????”的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中从外部应用程序获取 UI 文本

在 Spring 应用程序中从 FreeMarker 获取模板文本

如何在 R 中从参数中获取其名称的函数中创建变量?

在 XCTest 的 UI 测试中从 TextView 获取文本

在 jQuery AJAX Success 中从 MySql 获取特定响应

在java中从mysql获取表元数据