文字コードが UTF-8 形式のテキストファイルを BULK INSERT で SQL Server 2014 に一括取り込みしたくて苦労したのをメモ。

Unicode のテキストファイルを BULK INSERT で一括取り込みするのを調べると、「DATAFILETYPE=’widechar’」の指定をしなさいと書いてあります。

Unicode 文字形式を使用したデータのインポートまたはエクスポート (SQL Server)

まあこう書けって事ですな。

BULK INSERT T_Table
         FROM 'D:\UnicodeFile.txt'
         WITH (
                 DATAFILETYPE='widechar'
         ,       FIELDTERMINATOR = ','
         );
GO

しかし、この通り書いても UTF-8 形式のファイルは取り込めないんです。
(正確には UTF-8 固有の文字が無い UTF-8 ファイルなら取り込めます。おそらく自動認識で UTF-8 じゃないファイルと認識されている。)

Microsoft の BULK INSERT (Transact-SQL) の説明を読むと「SQL Server はコード ページ 65001 (UTF-8 エンコード) をサポートしません。」としっかり書いてあります。(投稿時時点)

マジか、詰んだ。ネット検索しても同じように解決しない人ばかりだと思っていたら・・。

2016年7月11日の SQL Server 2014 Service Pack 2 リリース情報 にしれっと「BCP ユーティリティと SQL Server 2014 SP2 での一括挿入 Transact-SQL コマンドの UTF-8 エンコーディングのサポート」と書いてありました。

日本語ページだとコード部分がおかしくなるので、英語ページを見ると「(CODEPAGE = ‘65001’, DATAFILETYPE = ‘Char’)」と記述すればいいとの事。
UTF-8 encoding support for the BCP utility and BULK INSERT Transact-SQL command in SQL Server 2014 SP2

つまり、以下のように書けという事です。

BULK INSERT T_Table
         FROM 'D:\UnicodeFile.txt'
         WITH (
                 DATAFILETYPE='char'
         ,       CODEPAGE = '65001'
         ,       FIELDTERMINATOR = ','
         );
GO

この記述で UTF8 形式のテキストファイルを一括取り込みできることを確認しました。
同じロジックで動く bcp ユーティリティでも取り込めています。
現時点では SQL Server 2014 SP2 と SQL Server 2016 だけが対応してるのかな。

ちなみに fmt ファイルを使って UTF-8 を取り込む方法はまだ出来ていません。
CODEPAGE の指定どこでやればちゃんと動くんだ・・。

同じ悩みを持つ他の人の参考になればと思い書いてみました。

トラックバック

このブログ記事に対するトラックバックURL:

コメント & トラックバック

No comments yet.

Comment feed

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)