【问题标题】:R database table pull encoding issueR数据库表拉编码问题
【发布时间】:2019-05-30 08:54:28
【问题描述】:

我有一个包含名称表的 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) &lt;- "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 编码的解释有什么不同

【问题讨论】:

    标签: r encoding dbplyr


    【解决方案1】:

    &lt;U+0338&gt; 是一个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 方法希望为您呈现字符(大部分时间)。

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 2021-11-21
      • 2017-09-24
      • 2017-04-06
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多