简化示例如下:
table <- data.frame(a=seq(1:3), b=c("És", "España", "Compañía"))
table
a b
1 1 És
2 2 España
3 3 Compañía
db <- dbConnect(MySQL(), user = "####", password = "####", dbname ="test", host= "localhost")
RMySQL::dbWriteTable(db, name="test1", table, overwrite=T, append=F )
Error in .local(conn, statement, ...) :
could not run statement: Invalid utf8 character string: 'Espa'
如您所见,重音符号("És")没有问题,但是ñ字符("España")存在问题。
另一方面,MySQL没有问题,因为这个查询可以正常工作:
INSERT INTO test.test1 (a,b)
values (1, "España");
在写表格之前,我已经尝试过以下方法:
对于所有表格都使用“UTF-8”编码。
对于所有表格都使用“iconv(x, “UTF-8”, “UTF-8”)”。
发送预查询:“dbSendQuery(db, “SET NAMES UTF8;”)”
将MySQL表格字符集更改为:“utf-8-general, latin-1, latin-1-spanish...”
*尝试使用“Latin-1”编码,但结果仍然失败。
我已经寻找这个问题的答案很长时间了,但没有得到帮助。
请帮忙!
版本信息:
MySQL 5.7.17
R版本3.3.0
Sys.getlocale()
[1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=C"
PS:在Linux环境下运行正常,但目前的项目中却被Windows困扰着:(
LC_COLLATE
中硬编码只有一个语言环境。 - Panagiotis Kanavosñ
被转换为n
。另一方面,Visual Studio的R工具没有这个问题,字符得以保留。 - Panagiotis Kanavosmake.names
函数,并清除了所有这些特殊字符。我知道这不是最好的解决方案,但它允许我交叉表格,因为它们都是以相同的方式导入的(使用make.names)。 - AlexSBGeneral
中的一个设置。长破折号或Excel文件也没有问题,前提是它们确实是Excel文件,而不仅仅是带有虚假扩展名的CSV文件。实际上,当您加载文件时,可以指定要使用的编码。如果您在Linux上工作,并且必须同时加载德语、俄语和乌克兰ASCII文件(真实故事,乌克兰啤酒灌装厂),那么您会怎么做?您不会为每个文件指定编码吗? - Panagiotis Kanavos