【问题标题】:Non-Latin characters show as question marks when using rodbc/odbc/dbplyr with SQL-Server将 rodbc/odbc/dbplyr 与 SQL-Server 一起使用时,非拉丁字符显示为问号
【发布时间】:2020-03-15 06:13:38
【问题描述】:

我正在使用 dbplyr 将数据从 SQL-Server 获取到 R,但中文、日文和其他非拉丁字符显示为“?”。我用的是windows机器。

我已阅读以下主题:

这些提供了一些有用的想法,但到目前为止没有任何效果。我试过了:

  • dbConnect 函数中设置encoding = 'UTF-8'。字符仍显示为问号。

  • dbConnect 函数中设置encoding = 'UTF-16'。 R 返回错误:# Error in iconv(x[current], from = enc, to = to, ...)

  • 将全局字符编码更改为 UTF-8:Sys.setenv(LANG = "UTF-8")options(encoding = "UTF-8")

  • 在绘图时检查字符是否显示(这表明它们被正确存储)。事实并非如此。

根据GitHub issue,我能够使用 RJDBC 正确显示字符,但是这与 dbplyr 不兼容。

这是我的会话信息:

> sessionInfo()
# R version 3.5.0 (2018-04-23)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows >= 8 x64 (build 9200)

# Matrix products: default

# locale:
# [1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252    LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
# [5] LC_TIME=English_United Kingdom.1252

我的代码如下所示:

> con <- dbConnect(odbc(),
                   Driver   = "SQL Server",
                   Server   = "server name",
                   Database = "database name",
                   user     = "my username",
                   password = "my password",
                   encoding = "UTF-8")

odbc/dbplyr 确实可以在 Windows 上处理这些字符类型,那么我在这里缺少什么?

任何帮助将不胜感激!

【问题讨论】:

  • 如何将这些字符传递给 SQL Server? SQL Server 2017 及更早版本也不支持 UTF-8。
  • 您确定编码是 UTF-8 吗? Windows 通常使用 Latin-1 编码。
  • @larnu 当我直接在 SSMS 中查询数据库时,字符会正确显示(我不确定我是否可以完全回答您的问题,因为我必须在我的团队中四处询问!)跨度>
  • @MrFlick 这让我很困惑。有些地方建议默认的 windows 编码是 Latin1,其他地方说 GB 1252,或类似的。我是字符编码的新手,所以我可能有一些误解。从我读过的线程来看,我需要 UTF-8 才能正确查看中文/日文字符
  • 当然 UTF-8 是错误的选择。 2019 年是第一个支持 UTF-8 的版本。

标签: r sql-server utf-8 odbc dbplyr


【解决方案1】:

检查iconvlist() 可用的编码列表。 我使用encoding = "windows-1252" 以便能够使用 ODBC 版本 1.2.2 正确处理北欧字符。

虽然我没有使用过中文或日文字符,但编码值“GB18030”、“gb2312”和“GBK”可以用于中文国标。

维基百科有一个有用的page(滚动到底部查看列表)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多