【问题标题】:R scripts in SQL Server 2016 corrupted with  characterSQL Server 2016 中的 R 脚本因  字符而损坏
【发布时间】:2016-12-12 11:14:58
【问题描述】:

在处理 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 命令在“消息”选项卡中返回:

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 中的数据类型,但无济于事。

【问题讨论】:

  • 不太确定为什么这被否决了,对我来说似乎是一个有效且新颖的问题。

标签: sql-server r microsoft-r


【解决方案1】:

问题似乎与 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

【讨论】:

  • 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2018-06-07
  • 2018-08-07
  • 1970-01-01
相关资源
最近更新 更多