如何在RODBC中为MySQL设置charset?

时间:2011-01-11 01:48:27

标签: mysql r odbc

我有一个带有中文字符的数据作为字段名称和数据,我已经从xls导入它们以访问2007并将它们导出到ODBC。然后我使用RODBC在R中读取它们,字段名称没问题,但是对于数据,所有中文字符都显示为?

我已阅读RODBC manual,并说:

If it is possible to set the DBMS or ODBC driver to communicate in the character set of the R session then this should be done. For example, MySQL can set the communication character set via SQL, e.g. SET NAMES 'utf8'.

我猜这是问题所在,但我如何通过RODBC向MySQL提供此命令?谢谢!

2 个答案:

答案 0 :(得分:2)

我不熟悉ODBC和RODBC,但是我对上述文档片段的阅读是SET NAMES 'utf8';是MySQL SQL dialect 的一部分,因此,您可以像运行从数据库中检索数据的任何其他SQL语句一样运行它。

像(未经测试)的东西:

sqlQuery(myChannel, query = "SET NAMES 'utf8';")

其中myChannelodbcConnect()返回的连接句柄。

你是否有理由使用RODBC而不是RMySQL包?我在使用RMySQL进行大量数据处理和从R内部检索复杂数据集方面有很好的经验。

<强>更新some evidence,至少在某一点上,{ODBC}驱动程序中SET NAMES已被停用。如果您有信心可以通过直接访问数据库(通过mysql或MySQL的GUI前端之一)来阅读角色,那么您可以尝试复制SET NAMES所做的事情。以下内容来自MySQL manual

A SET NAMES 'x' statement is equivalent to these three statements:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

您可以尝试执行这三个SQL语句来代替SET NAMES,看看是否有效。

同一手册也记录SET CHARACTER SET,其使用方法与SET NAMES相同:


SET CHARACTER SET charset_name

SET CHARACTER SETSET NAMES类似,但将character_set_connectioncollation_connection设置为character_set_databasecollation_databaseSET CHARACTER SET x语句等同于这三个语句:

SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;

设置collation_connection还会将c haracter_set_connection设置为与排序规则关联的字符集(相当于执行SET character_set_connection = @@character_set_database)。没有必要明确设置character_set_connection


您可以尝试使用SET CHARACTER SET 'utf8'

最后,你在运行什么字符集/语言环境?看起来你在Windows上 - 这是一个UTF8语言环境吗?我还注意到你的Q中有些混乱。你说你已经将数据导入MS Access,然后将其导出到ODBC。你的意思是你把它导出到MySQL?我虽然ODBC是一个连接驱动程序,允许与一系列数据库之间的通信,而不是你可以“导出”的东西。

你的数据真的在MySQL吗?您是否可以通过RODBC连接到MS Access以从那里读取数据?

如果数据在MySQL中,请尝试使用RMySQL包连接到数据库并读取数据。

答案 1 :(得分:2)

我刚刚找到了治疗方法。不知道我是否可以发帖。

  1. 将MySQL数据库设置为基于UTF-8;

  2. 设置ODBC DSN,不要设置“字符集”选项。

  3. ch<-odbcConnect("mydb",DBMSencoding="UTF-8");

  4. 就是这样。