2003年6月12日
『テキストファイルの UNICODE化』
システム管理 ML での話題を紹介します。
・タスクスケジューリングについて
・データ追加時に I/O エラーが発生する
・CREATE DATABASE で Disk Writes Byte/sec は ?
・テーブルエラーについて
・sp_help_job について
・DB のバックアップについて
・ジョブの監視について
現時点で ML のメンバーでなくても、
http://www.sqlpassj.org/bbs/ml_disp.aspx?forum_id=3
より閲覧可能です。
SQL Server に外部から大量のデータをインポートする場合、BCP を愛用されている方も多いと思います。
・ライセンスが確保できれば SQL Server のバージョンをまたがって統一的に扱える
・機能のまとまりがよく、結果が即座にえられる
点で、とても使い勝手のよいツールだと思います。
そのなかで、区切り文字(特に field terminator )だけは問題の原因になることが多いようです。
例えばテキストファイル生成時に区切り文字の指定が可能な場合、まず異なった文字を使用したファイルを生成します。区切り文字の個数(可能なら行数)を比較することで、ある程度データ内区切り文字混入を調べ、適切な文字を選択することができます。
似たような状況でもう少し厄介なのが、漢字等含まれたデータです。例えばシフトJIS として保存され漢字の 2 Byte目と区切り文字が一致する場合、なかなか気が付かないものです。
SQL Server 1 年生掲示板でこの状態に引っかかったと思われる発言がありました。
一番簡単な対応法兼確認法は不用意な一致から逃れるために、シフトJIS から UNICODE に保存しなおすことです。Windows
2000 であれば「メモ帳で UNICODE を選択し、保存」がもっとも容易です。
ここからが私が間違えていた部分なのですが、ファイルサイズが大きくなった場合メモ帳では厳しいので
cmd /u /c type 品目コード.txt>品目コードU.txt
という方法も紹介しました。
実行してみると、だいたいあってます。ただし bcp から読み込んだ場合には、おもった結果にならないという障害が出てしまいました。
結論から言うと、CMD の機能で UNICODE 化した場合、 >> での追加に配慮した結果か UTF-16
先頭の Byte Order Mark( 2 Byte FF FE) が出力されていませんでした。このため、アプリケーションにより
UNICODE とみなすかどうかがばらついてしまいました。一応 Byte Order Mark だけの UNICODE テキストファイルに追加する手順であれば対応可能なようです。
すこし恥ずかしい体験談なのですが、BCP の落とし穴や UNICODE ファイルのハンドリングは会員の方々の参考になるかと思い紹介します。なお、調査には
FC での比較が大活躍しました。
|