0


1

BCPおよびUTF-16を使用して、SQLServer 2005のnvarcharフィールドにロードするためのファイルをJavaで作成します

BCPを使用して、ローダー制御ファイルを使用してnvarcharフィールドを持つSQL Server 2005テーブルにロードしたい。 私が理解しているように、SQL Server 2005はUTF-16のみをサポートしています(そしてUTF-16 LEであると信じています)。 ファイルはJavaプログラムによって出力されています。 現在設定している方法は次のとおりです。

  1. XML形式のBCPローダーファイル(次のコマンドを使用して作成: bcp test_table format nul -c -x -T -f test_table.xml -S server

  2. 次のコードを使用して出力を書き込むJavaプログラム:

    File f = new File("from_java.txt");
    String encoding = "x-UTF-16LE-BOM";
    OutputStream os = new FileOutputStream(f);
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding);
    String theString = "áááááLittle Endian, BOM\r\n";
    outputStreamWriter.append(theString);
    outputStreamWriter.flush();
    outputStreamWriter.close();
  3. 次に、次のbcpコマンドを使用します。 「from_java.txtのbcp test_table -T -f test_table.xml -S server -error error.txt」

私が得たのは「ÿþá」です。 `áááááLittleEndian、BOM`ではありません

パラメーターを変更するいくつかの異なる組み合わせを試しました。

  • ローダー制御ファイルの生成方法を変更する(-nを使用して 文字データの-cの代わりにネイティブデータ…​これは何か関係があると思いますが、挿入されたデータに改善は見られませんでした)

  • UTF-16エンコーディングのいくつかの異なる形式を試してみました。 BOMのないエンディアンとリトルエンディアン

  • 私がどこかで読んだときにBOMをファイルに手動で出力しようとしました マイクロソフトは、BOM情報を活用したい

  • (UTF-16の代わりに)UCS-2としてファイルを出力しようとしています それは(明らかに)BCPが実際にファイルを読み込んでいるものです

  • bcpインポートで-wを試しましたが、これは機能しますが、連動しません ローダー形式ファイルで

  • windows-1252でファイルを出力して指定すると、動作するようになります ファイルをロードするときのbcpの `-c 1252`オプションとしてのコードページ(ただし、UTF-16は1252と比較して表現できるもののスーパーセットであるため、情報を失うため、これを行いたくありません)

ローダー形式の構成ファイルと一緒にUTF-16データを使用して、bcpをnvarcharフィールドに読み込むことができましたか?

前もって感謝します、

  • ジェームズ

1 Answer


0


私は文字通り反応に圧倒されましたが、それを破りました。

ローダーファイルは `-w`フラグで生成する必要があるため、ファイルを生成するコマンドは次のとおりです。

bcp

format nul -w -x T -f loader-control-w-format.xml -S -t "||"

これにより、ローダー制御ファイルが少し違って見えるようになり、次のようなエントリが得られます。

``

区切り文字は `| \ 0 | \ 0`としてリストされ、ゼロはファイル内の余分なバイトに対応します。UTF-16(またはMicrosoft(間違って)呼ぶ「ユニコード」)は2バイト文字エンコーディングです。

この方法でBCPを扱う他の人の健全性に関するいくつかの注意事項:

  • SQLServerが「ネイティブ」と言うときは、ネイティブ文字、つまり アクセント文字

  • SQLServerがUnicodeについて話すとき、それらが実際に意味するのはUTF16です (リトルエンディアン)* Unicode文字セット *をエンコードする方法。 これは、-wが関係するものです

  • UTF-16を使用してBCPにロードするファイルを作成する場合、ファイルは UTF-16リトルエンディアン形式であり、UTF BOMを含むことはできません(BCPはこれをロードする必要があるバイトと解釈し、最初のレコードにはBOMが含まれているため、!)

この方法でロードできるUTF-16でファイルを書き出すためのJavaコードは次のとおりです。

    final File f = new File("C:\\temp\\bcp_prob\\from_java-UTF-16.txt");
    //LE with no BOM is important here:
    final String encoding = "UTF-16LE";
    final OutputStream os = new FileOutputStream(f);
    final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(os, encoding);
    final String theString = "UTF-16-LE, intermetálico básicos intermetálico película magnética dinámicos||another_col\r\n";
    outputStreamWriter.append(theString);
    outputStreamWriter.flush();
    outputStreamWriter.close();