0

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

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

到目前为止我所尝试的:NLS_LANG=AMERICAN_AMERICA.AL32UTF8将 NLS_LANG放入 /etc/environment后,Linux R 中的字符开始看起来不错。SELECT * FROM V$NLS_PARAMETERS通过在 Linux 的 R 中运行和运行,我认为这些是正确的 NLS_LANG 设置SELECT * from NLS_SESSION_PARAMETERS。尽管这并不能解决 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 应用程序端正确获取编码的任何帮助 =)

4

1 回答 1

0

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

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

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

于 2020-09-04T09:07:04.653 回答