R数据库表拉编码问题

时间:2019-01-03 18:28:26

标签: r encoding dbplyr

我有一个包含名称表的MySQL数据库。一旦将它们放入R中,我就会遇到一些编码问题,这些问题我不了解,但似乎与R解释文件的方式有关。

con <- dbConnect(MySQL(),
                 host = 'localhost',
                 user = 'root',
                 dbname='test',
                 rstudioapi::askForPassword('Database password')
)

并使用

从我的MySQL数据库中提取names
df <- dbReadTable(con, 'names')

我的桌子看起来像

df <- structure(list(id = c(373863, 17731249), name = c("AARESTRUP, JAN CARO̸E", 
"BÃœTTNER, CHRISTIAN")), .Names = c("id", "name"), class = "data.frame", row.names = c(NA, 
-2L))


df
        id                   name
1   373863 AARESTRUP, JAN CARO̸E
2 17731249    BÃœTTNER, CHRISTIAN

检查编码是否带来

Encoding(df$name)
[1] "unknown" "unknown"

使用Encoding(df$name) <- "UTF-8"固定第二个名称,但将名称的一部分转换为非UTF-8字符。

df
        id                         name
1   373863 AARESTRUP, JAN CARO<U+0338>E
2 17731249           BÜTTNER, CHRISTIAN

现在,当df$name[1]返回时,它变得很奇怪 [1] "AARESTRUP, JAN CARO̸E"正是它存储在MySQL数据库中的方式,而当我调用整个df时,它似乎有不同的解释。

首先,有一种方法可以确保dbReadTable()自动读入UTF-8。我发现link似乎在表编码方面没有任何改变。

第二,根据您访问名称的方式(整个df与单个元素),非UTF-8编码在解释上的差异是怎么回事

1 个答案:

答案 0 :(得分:1)

<U+0338>UTF-8 character。但这是一个叠加字符,在渲染时与它前面的O占据相同的空间。由于某种原因,它显示不正确(尽管我检查了一下,在R中它显示正确,所以似乎与StackOverflow或Firefox有关)。您可以使用

apply(df, MARGIN = 2, FUN = function(x) if( typeof(x) == 'character' ) Encoding(x)<-'UTF-8')

在所有数据库结果表上,这会将所有字符列的编码转换为UTF-8。

我认为调用df$name[1]与调用df之间的行为差​​异与字符类型对象与data.frames的不同打印/显示方法有关。

df希望向您显示各个字符,这意味着它不想以掩盖E的事实显示两个字符的方式渲染字符。它也不想将字符显示为空格字符,因为这样看起来像反斜杠。显示字符的unicode是让用户知道它的最佳方法。

字符类型对象的show方法想(大多数情况下)为您呈现字符。