0

BCPを使用して、ローダー制御ファイルを使用してnvarcharフィールドを含むSQLServer2005テーブルにロードしたいと思います。私が理解しているように、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コマンドを使用します。
    bcp test_table in from_java.txt -T -f test_table.xml -S server -error error.txt

私がテーブルに入れるのはですÿþá。ではなくáááááLittle Endian, BOM

パラメータを変更するいくつかの異なる順列を試しました。

  • ローダー制御ファイルの生成方法を変更します(文字データの場合は-cではなくネイティブデータの場合は-nを使用します...これは何か関係があると思いますが、挿入されたデータに改善は見られませんでした)
  • ビッグエンディアンとBOMのないリトルエンディアンを含むUTF-16エンコーディングのいくつかの異なる形式を試しましたが、役に立ちませんでした
  • MicrosoftがBOM情報を利用したいということをどこかで読んだので、ファイルにBOMを手動で出力しようとしました。
  • ファイルを(UTF-16ではなく)UCS-2として出力しようとすることを検討しました。これは、(明らかに)BCPが実際にファイルを読み込んでいるものです。
  • bcpインポートで-wを試しましたが、これは機能しますが、ローダー形式のファイルと組み合わせることはできません(ファイルがUTF-16でエンコードされていることをBCPに伝える魔法を形式ファイルに組み込む方法はありますか?)
  • Windows-1252でファイルを出力し、ファイル-c 1252をロードするときにbcpのオプションとしてそのコードページを指定すると、動作させることができます(ただし、UTF-16のように情報が失われるため、これは実行したくありません。 1252と比較して表現できるもののスーパーセット)

ローダー形式の構成ファイルと組み合わせてUTF-16データを使用してbcpをnvarcharフィールドにロードすることに成功した人はいますか?

前もって感謝します、

-ジェームズ

4

1 に答える 1

0

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

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

bcp <table> format nul -w -x T -f loader-control-w-format.xml -S <server> -t "||"

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

<FIELD ID="1" xsi:type="NCharTerm" TERMINATOR="|\0|\0" MAX_LENGTH="1000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>

区切り文字が としてリストされていることに注意してください|\0|\0。ゼロはファイル内の余分なバイトに対応します。UTF-16 (または、Microsoft が (誤って) 呼び出すように単に「ユニコード」) は 2 バイト文字エンコーディングです。

このように BCP を扱っている他の人の正気のためのいくつかのメモ:

  • SQLServer が「ネイティブ」と言う場合、ネイティブ文字、つまりアクセント付き文字を意味します。
  • SQLServer が Unicode について話すとき、実際に意味するのは、Unicode 文字セットをエンコードする UTF16 (リトル エンディアン) 方式です。これは -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();
于 2010-02-15T15:57:54.460 に答える