当前位置: 首页 > 面试题库 >

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

方昊英
2023-03-14
问题内容

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

我尝试了设置options(encoding='UTF-8')DBMSencoding='UTF-8'通过ODBC连接时,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

问题答案:

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

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

这个问题为我指明了正确的方向。



 类似资料:
  • 问题内容: 我需要阅读一个以GBK编码的文本文件。Go编程语言中的标准库假定所有文本均以UTF-8编码。 如何读取其他编码的文件? 问题答案: 以前(如在较早的答案中所述),“简单”的方法是使用需要cgo并包装iconv库的第三方程序包。由于许多原因,这是不希望的。值得庆幸的是,有一段时间以来,仅使用Go Authors提供的软件包(不是在主要软件包中,而是在Go子存储库中),就有了一种上乘的Go

  • 任何帮助都很感激..谢谢..!!!

  • 问题内容: 根据MySQL,一列可容纳65,535个字节。 因此,如果这是一个合理的边界,那么它实际上只能容纳大约32k UTF-8字符,对吗?还是这是“模糊的”界限之一,编写文档的人无法分辨字节中的字符,并且如果将其设置为类似内容,实际上将允许〜64k UTF-8字符? 问题答案: 一列最多可包含字节。 一个字符最多可以为3个字节。 所以…您的实际限制可以是字符。 有关更多信息,请参见手册:ht

  • 问题内容: 为什么sql数据库使用UTF-8编码?他们都使用8位来存储字符吗? 问题答案: UTF-8用于支持大范围的字符。在UTF-8中,最多可以使用4个字节来表示单个字符。 乔尔(Joel)撰写了一篇有关该主题的文章,您可能希望参考 每个软件开发人员绝对,肯定必须了解的Unicode和字符集的绝对最低要求(无借口!)

  • 我想使用R从一个数组中读取“when”值。由Google My tracks创建的kml文件(摘录如下): 节点“when”是“与位置相对应的时间值(在gx:coord元素中指定)”。“gx:coord”是“由经度、纬度和高度三个值组成的坐标值”。(https://developers.google.com/kml/documentation/kmlreference#gxtrack) 我想要的值

  • 我有一个任务: 当我使用命令时: 文本显示不正确。如何修复?谢谢