【问题标题】:Encoding in ROracleROracle 中的编码
【发布时间】:2018-05-16 08:50:24
【问题描述】:

我在使用 ROracle 从 Oracle 数据库导入挪威字符(如 æ、ø 和 å)时遇到问题。我以前在使用 RODBC 时遇到过类似的问题。从 csv 和 xlsx 等文件导入时我没有问题,我确定问题在于使用 ROracle 导入时设置编码,但文档并没有真正告诉我如何做到这一点。

各种答案编写了一个用于在导入后转换为 UTF-8 的函数,但这不是一个适合我的解决方案。我希望使用 dplyr 包对 oracle DB 进行查询,并且需要能够使用æøå 之类的字母进行查询。

这是我的连接字符串,以及我用作测试的 sql-query:

library(ROracle)

drv <- dbDriver("Oracle", unicode_as_utf8 = TRUE, ora.attributes = TRUE)
# Create the connection string
host <- "xx.xxx.xx.x"
port <- xxxx
sid <- "xxxxxx"
connect.string <- paste(
  "(DESCRIPTION=",
  "(ADDRESS=(PROTOCOL=tcp)(HOST=", host, ")(PORT=", port, "))",
  "(CONNECT_DATA=(SID=", sid, ")))", sep = "")
con <- dbConnect(drv, username = "",
                 password = "",dbname=connect.string)

test <- dbGetQuery(con, "SELECT DECODE FROM T_CODE where key_id=17")

这给了我这样的结果:R?dgivningskontor

这是我的会话信息:

R version 3.5.0 (2018-04-23)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.4

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ROracle_1.3-1 DBI_1.0.0    

loaded via a namespace (and not attached):
[1] compiler_3.5.0 tools_3.5.0    yaml_2.1.19  

【问题讨论】:

  • 您的应用程序的所有部分,包括 UTF-8 的数据传输吗?原始 Oracle 数据库是否设置为 UTF-8 或其他 Unicode 序列化编码?
  • Oracle 数据库有 NLS_CHARACTERSET WE8MSWIN1252,RStudio 有 UTF-8 设置为编码。
  • 那么你需要使用接受WIN1252字符集的驱动程序来读取原始数据库,这样你就可以将数据转码为UTF-8。
  • ROracle 应该能够做到这一点,但我不太清楚如何正确设置。我尝试在 /etc/profile 中设置 NLS_LANG = "AMERICAN_AMERICA.AL32UTF8",但没有成功。

标签: r oracle encoding roracle


【解决方案1】:

我已经为这个问题苦苦挣扎了 2 天,但我刚刚找到了解决方案。

我的问题是正确显示“ü”或“é”等字符(出于测试目的,我还添加了“ø”,显示为“?”)。 我试图以不同的方式和不同的字符集设置 NLS_LANG 环境变量。

最后,这些是对我有用的步骤:

  1. NLS_LANG="AMERICAN_AMERICA.AL32UTF8" 添加到.Renviron 文件中。这适用于我的情况,Oracle DB 显示 NLS_CHARACTERSET=WE8ISO8859P15,客户端的区域设置 ID 显示 en_US.UTF-8
  2. 保存文件并重新启动 RStudio 会话。

再次运行和查询数据库时,此时字符显示正确。

【讨论】:

    【解决方案2】:

    无法评论,所以我写这个作为答案。

    .Renviron 解决方案对我来说适用于西班牙数据库,但是当我使用 NLS_LANG="AMERICAN_AMERICA.AL32UTF8" 时,密码和用户名出现错误。

    然后我找到了这个article,终于明白了,我的解决办法是。

    # First with 'usethis' library create the .Renviron
    library(usethis)
    usethis::edit_r_environ()
    
    # Then add the NLS_LANG in Renviron
    # NLS_LANG=".WE8ISO8859P1"
    
    # If for some reason Renviron wont load you can use this in your script
    readRenviron("path_to_the_file/.Renviron")
    

    当然重启 RStudio,我终于可以得到ñ 字符而不是? simbol。

    感谢@Ion Garaicoechea

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-05
      • 2018-10-29
      • 1970-01-01
      • 2019-02-03
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多