BCP と UTF-16 を使用して SQLServer 2005 の nvarchar フィールドに読み込むためのファイルを Java で作成する

StackOverflow https://stackoverflow.com/questions/2246355

質問

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 コマンドを使用します。
    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 フィールドにロードすることに成功した人はいますか?

前もって感謝します、

-ジェームズ

役に立ちましたか?

解決

私は文字通り、返答に圧倒されてしまいましたが、それを解決しました。

ローダー ファイルは次のように生成する必要があります。 -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 (またはマイクロソフトが (誤って) 呼んでいるように単に「ユニコード」と呼んでいます) は 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();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top