【问题标题】:Roracle special characters on ShinyServer (Linux)Shiny Server (Linux) 上的 Oracle 特殊字符
【发布时间】:2020-12-23 11:52:58
【问题描述】:

似乎有很多类似的问题和答案,但到目前为止还没有找到适合我的解决方案。

简而言之: 应用程序在 Linux Shiny 服务器上运行时,特殊字符(简写字母、欧姆符号、摄氏度符号等)都会被打乱。 Shiny Dashboard 上显示的数据是从 Oracle 数据库中查询的。这些示例中的列名称为“NAME”,类型为 VARCHAR2。当我在 R 中的 Linux 服务器或本地 Windows RStudio 上运行类似代码时,所有字符看起来都很好。

到目前为止我所做的尝试: 在 /etc/environment 中将 NLS_LANG 设置为 NLS_LANG=AMERICAN_AMERICA.AL32UTF8 后,字符开始在 Linux R 中看起来不错。通过在 Linux 的 R 中运行 SELECT * FROM V$NLS_PARAMETERSSELECT * from NLS_SESSION_PARAMETERS,我认为这些是正确的 NLS_LANG 设置。尽管这并不能解决 Shiny Server 端的问题。

我也玩过 dbConnect 编码参数,但没有运气。

有些可重现的示例:(抱歉,我无法访问我的 Oracle 服务器 ;-))

library(ROracle)

ORAdrv <- dbDriver("Oracle", unicode_as_utf8 = TRUE, ora.attributes = TRUE) #doesn't matter if I have these two latter attributes or not
ORAconnect.string <- paste(
  "(DESCRIPTION=",
  "(ADDRESS=(PROTOCOL=tcp)(HOST=xx.xx.xx.xx)(PORT=xxxx))",
  "(CONNECT_DATA=(SID=...)))", sep = ""
)

query2 <- ("select NAME, DATA_FIELD from TABLE where DATA_FIELD in ('ID7018789', 'ID7025838', 'ID7021380')")

ORAcon <- dbConnect(ORAdrv, username = "...", password = "...", dbname = ORAconnect.string, encoding = "UTF-8") #doesn't matter if encoding is defined or not

res <- dbSendQuery(ORAcon, query2, 'set character set "utf8"') #doesn't matter if the last attribute is defined or not

df <- fetch(res)
dbDisconnect(ORAcon)
print(df)

最终结果是什么样子的:

如果我在 Linux R 中运行代码,结果是预期的(欧姆、摄氏度符号和扫描字符看起来不错):

如果我在 ShinyServer 应用程序上运行相同的代码并将数据帧呈现为数据表,结果如下:(欧姆和摄氏度符号被替换为问号,扫描字符 äö -> ao)

非常感谢任何有关在 Shiny Server 应用程序端正确获取编码的帮助 =)

【问题讨论】:

    标签: r linux shiny environment-variables roracle


    【解决方案1】:

    我终于能够解决它。如果其他人正在为此苦苦挣扎,请将该列转换为查询中已经存在的 nvarchar。

    就我而言,to_nchar(NAME) 成功了。

    https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions187.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2023-01-19
      • 2021-02-01
      • 1970-01-01
      相关资源
      最近更新 更多