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 コマンドは、[メッセージ] タブでこれを返します。

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 に答える