我有一个带有中文字符的数据作为字段名称和数据,我已经从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提供此命令?谢谢!
答案 0 :(得分:2)
我不熟悉ODBC和RODBC
,但是我对上述文档片段的阅读是SET NAMES 'utf8';
是MySQL SQL dialect 的一部分,因此,您可以像运行从数据库中检索数据的任何其他SQL语句一样运行它。
像(未经测试)的东西:
sqlQuery(myChannel, query = "SET NAMES 'utf8';")
其中myChannel
是odbcConnect()
返回的连接句柄。
你是否有理由使用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 SET
与SET NAMES
类似,但将character_set_connection
和collation_connection
设置为character_set_database
和collation_database
。 SET 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)
我刚刚找到了治疗方法。不知道我是否可以发帖。
将MySQL数据库设置为基于UTF-8;
设置ODBC DSN,不要设置“字符集”选项。
ch<-odbcConnect("mydb",DBMSencoding="UTF-8");
就是这样。