3

在处理 R 脚本中的损坏管道时,我发现了 SQL Server 2016 的一种奇怪行为。请参阅下面的 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 命令在 Messages 选项卡中返回:

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

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

BadEncodingColumn   GoodEncodingColumn
¦                  a,b,c

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

这种行为的任何解决方案?还有加分,这个角色有什么“特别”之处?

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

4

1 回答 1

3

问题似乎与 R 脚本中的非 ASCII 字符的编码有关(损坏的管道在 128 个 ASCII 字符之外)。您可以使用 'Encoding' 函数将编码显式覆盖为 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
于 2016-12-12T22:05:31.267 回答