如何在SSMS中执行SQL Server外部R脚本时解决编码乱码问题
问题根因
该乱码是SQL Server捕获自定义R运行时STDOUT输出时的编码不匹配导致的:
- 微软官方捆绑的R 2.x版本内部做了适配,输出字符编码和SQL Server的STDOUT捕获逻辑一致,因此无乱码
- 自定义安装的R 4.x默认输出为UTF-8编码,但SQL Server外部脚本的STDOUT捕获默认使用Windows系统本地编码(通常为CP936/GBK),二者不匹配就会出现乱码
- 网格结果集正常是因为走结构化数据流转路径,输出时会自动适配NVARCHAR的Unicode编码,因此不受影响
修复方案
方案1:R脚本内强制转换输出编码(无需改系统配置,优先级最高)
在每个R脚本开头添加两行代码,强制将R的标准输出编码改为系统本地编码:
# 强制设置标准输出编码为Windows系统默认ANSI编码 options(encoding = "native.enc") sink(stdout(), type = "output", encoding = "native.enc")
测试用例修改后如下:
EXEC sp_execute_external_script @language =N'myR', @script=N' options(encoding = "native.enc") sink(stdout(), type = "output", encoding = "native.enc") print("ÅÄÖ");'
方案2:修改R运行时全局配置(一次修改永久生效)
找到自定义R安装路径下的Rprofile.site文件(默认路径为C:\Program Files\R\R-4.1.0\etc\Rprofile.site),在文件末尾添加如下配置:
# 适配SQL Server外部脚本输出编码 options(encoding = "native.enc") sink(stdout(), type = "output", encoding = "native.enc")
修改完成后重启SQL Server Launchpad服务即可生效,所有R外部脚本的STDOUT输出都会自动适配编码。
方案3:修改系统区域设置(非必要不推荐,会影响其他应用)
如果上述方案都无效,可以将Windows服务器的系统区域设置改为UTF-8兼容模式:
- 打开「控制面板」-「时钟和区域」-「区域」-「管理」选项卡
- 点击「更改系统区域设置」
- 勾选「Beta版:使用Unicode UTF-8提供全球语言支持」
- 重启服务器生效
该修改会影响服务器上所有依赖系统编码的老旧应用,非必要不要使用。
内容的提问来源于stack exchange,提问作者Martin Bring
相关产品推荐
相关产品推荐

