在 SSMS 中执行外部脚本时,如何在 SQL 服务器上的 R 上获得正确的编码?

How to get correct encoding on R on SQL Server when executing external script in SSMS?

我们在一台服务器上安装了 R 4.1,当通过 SSMS (SQL Server Management Studio) 运行 宁外部脚本时,它会产生乱码。我们在安装时使用了这个指南:Install an R custom runtime for SQL Server

EXEC sp_execute_external_script
    @language =N'myR',
    @script=N'
print(R.version);'

来自外部脚本的 STDOUT 消息: ��_��
��平台�� ��x86_64-w64-mingw32��
��arch�� ��x86_64��
��os�� ��mingw32��
��系统�� ��x86_64, mingw32��
��状态�� ����
��主要�� ��4��
��minor�� ��1.0��
��年�� ��2021��
��月�� ��05��
��天�� ��18��
��svn rev�� ��80317��
��语言�� ��R��
��version.string�� ��R 版本 4.1.0 (2021-05-18)�� ��昵称�� ��Camp Pontanezen��

如果我 运行 在网格中返回结果集,一切似乎都很好。

EXEC sp_execute_external_script @language = N'myR'
    , @script = N'
OutputDataSet <- data.frame(installed.packages()[,c("Package", "Version", "Depends", "License", "LibPath")]);'
WITH result sets((
            Package NVARCHAR(255)
            , Version NVARCHAR(100)
            , Depends NVARCHAR(4000)
            , License NVARCHAR(1000)
            , LibPath NVARCHAR(2000)
            ));

如果我 运行 在 RGui.exe 中使用相同的脚本,也可以

print(R.version); _
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 4
minor 1.0
year 2021
month 05
day 18
svn rev 80317
language R
version.string R version 4.1.0 (2021-05-18) nickname Camp Pontanezen

更简单的示例:

EXEC sp_execute_external_script
    @language =N'myR',
    @script=N'
print("ÅÄÖ");'

给出:

"��ÅÄÖ��"

我们对另一个 R 服务器使用相同的 SSMS,使用捆绑版本的 R(2.x 或其他)然后它正确显示。

服务器上的编码似乎是正确的,但当它在 SSMS 中为 运行 并且结果为“字符串”时,结果输出不正确。如何纠正这一问题?

Sys.getenv()(与 R 相关)在机器上 工作:

R_ARCH /x64 R_ARCH_BIN /x64 R_BROWSER
R_BZIPCMD bzip2 R_CMD R CMD R_COMPILED_BY gcc 8.3.0 R_DEFAULT_PACKAGES
datasets,utils,grDevices,graphics,stats R_DOC_DIR
D:/RCompile/recent/R-4.0.3/doc R_GAMS_SYSDIR
d:/RCompile/CRANpkg/extralibs215/GAMS/win64 R_GC_GROWINCRFRAC
0.2 R_GSCMD C:/Progra~2/gs/gs9.21/bin/gswin32c.exe R_GZIPCMD gzip R_HOME C:/Program Files/R/R-4.1.0 R_INCLUDE_DIR
D:/RCompile/recent/R-4.0.3/include R_INSTALL_PKG RInside R_INSTALL_TAR tar.exe R_LIBS_USER
C:/Users/CRAN/Documents/R/win-library/4.0 R_MAX_NUM_DLLS 153 R_OSTYPE windows R_PACKAGE_NAME RInside R_PAPERSIZE a4 R_PAPERSIZE_USER a4 R_PARALLEL_PORT random R_RD4PDF times,inconsolata,hyper R_SCRIPT_LEGACY yes R_SESSION_TMPDIR
C:/WINDOWS/ServiceProfiles/MSSQLLaunchpad$MABI_SQLSERVER/AppData/Local/Packages/38af79a5ed4e7cad1e6ad6e9e57a562d-appcontainer1/AC/Temp R_SHARE_DIR D:/RCompile/recent/R-4.0.3/share R_UNZIPCMD
unzip R_USER C:/Users/CRAN/Documents R_VERSION
4.0.3 R_ZIPCMD zip

Sys.getenv()(与R相关)在机器上工作:

R_ARCH /x64 R_COMPILED_BY gcc 4.9.3 R_HOME D:/ProgramData/INSTANS01/R R_LIBS_USER
D:\ProgramData\INSTANS01\Temp-R\Appcontainer1\FF5697C0-8563-40AE-85B0-3DDE0B6C59C4/R/win-library/3.5 R_USER
D:\ProgramData\INSTANS01\Temp-R\Appcontainer1\FF5697C0-8563-40AE-85B0-3DDE0B6C59C4 R_ZIPCMD
D:/ProgramData/INSTANS01/R/library/RevoScaleR/utils/infoZip/zip.exe

SMSS 的默认编码为 UTF-16。您应该能够将 R 中的默认编码更改为那个或这个 article 详细说明了如何在 SSMS 中更改它。我不确定这是否会奏效,但在这一点上,尝试一下不会有什么坏处。

祝你好运

经过大量搜索,没有找到任何解决方案,我们降级到 3.6.3 并且它按预期工作。它似乎是 R 4.1 中关于编码的 bug/difference。