SQL Server 2016 中的 R 脚本损坏了 Â 字符

R scripts in SQL Server 2016 corrupted with  character

我发现 SQL Server 2016 在处理 R 脚本中损坏的管道时有一个奇怪的行为。请参阅下面的 T-SQL 代码:

DECLARE 
    @r nvarchar(100)

/* Create a data frame with a broken pipe as one of its fields and a simple ASCII encoded string in another. */
SET @r = N'
df <- data.frame(
    a = "¦",
    b = "a,b,c"
    )';

/* Print @r to detect the inclusion of any unwanted characters. */
PRINT @r;

/* Execute and retrieve the output. */
EXECUTE sp_execute_external_script
    @language = N'R',
    @script = @r,
    @output_data_1_name = N'df'
WITH RESULT SETS ((
    BadEncodingColumn varchar(2),
    GoodEncodingColumn varchar(5)
    ));

消息选项卡中的 PRINT 命令returns:

df <- data.frame(
    a = "¦",
    b = "a,b,c"
    )

但是,最终的“结果”选项卡如下所示:

BadEncodingColumn   GoodEncodingColumn
¦                  a,b,c

这种行为似乎出现在脚本的 EXECUTE sp_execute_external_script 阶段,我在处理 Excel、R 和其他版本的其他编码问题时看到了这个字符 (Â) SQL服务器。

对这种行为有什么解决办法吗?还有奖励积分,关于 Â 字符的 'special' 是什么?

编辑:我曾尝试修改 SQL Server 和 R 中的数据类型,但无济于事。

问题似乎与 R 脚本中的非 ASCII 字符编码有关(损坏的管道在 128 个 ASCII 字符之外)。您可以使用“编码”函数将编码显式覆盖为 Unicode(UTF-8) 以解决此问题。例如你的脚本可以更新如下

DECLARE 
    @r nvarchar(100)

/* Create a data frame with a broken pipe as one of its fields and a simple ASCII encoded string in another. */
SET @r = N'
df <- data.frame(
    a = "¦",
    b = "a,b,c"
    )

Encoding(levels(df$a)) <- "UTF-8" ###### Encoding override'

/* Print @r to detect the inclusion of any unwanted characters. */
PRINT @r;

/* Execute and retrieve the output. */
EXECUTE sp_execute_external_script
    @language = N'R',
    @script = @r,
    @output_data_1_name = N'df'
WITH RESULT SETS ((
    BadEncodingColumn varchar(2),
    GoodEncodingColumn varchar(5)
    ));

产生以下结果

BadEncodingColumn   GoodEncodingColumn
¦                   a,b,c