Erstellen Sie eine Datei in Java zum Laden in ein nvarchar Feld in SQL Server 2005 unter Verwendung von BCP und UTF-16

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

Frage

Ich möchte in eine SQL Server 2005-Tabelle BCP Last verwenden, um mit einem nvarchar Feld einer Ladesteuerdatei. Wie ich es verstehe, SQL Server 2005 unterstützt nur UTF-16 (und ich glaube, es ist UTF-16 LE ist). Die Datei wird ausgegeben von einem Java-Programm. Die Art und Weise habe ich es bis zur Zeit ist wie folgt:

  1. Eine XML-Format BCP Loader-Datei (mit dem folgenden Befehl erstellt: bcp test_table format nul -c -x -T -f test_table.xml -S server)

  2. Ein Java-Programm mit dem folgenden Code die Ausgabe zu schreiben:

    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. Dann mit dem folgenden Befehl bcp:
    bcp test_table in from_java.txt -T -f test_table.xml -S server -error error.txt

Was ich in der Tabelle erhalten, ist ÿþá. und nicht áááááLittle Endian, BOM

Ich habe ein paar verschiedene Permutationen von Ändern von Parametern versucht:

  • Ändern der Art, wie ich das Ladesteuerdatei erzeugen (mit -n für native Daten statt -c für Zeichendaten ... ich denke, das etwas damit zu tun haben, aber ich habe keine Verbesserung in meiner eingefügten Daten)
  • verschiedene Formen der UTF-16-Codierung versucht, einschließlich der Big-Endian und Little-Endian ohne BOM, ohne Erfolg
  • versucht, die Stückliste manuell in der Datei ausgeben, wie ich irgendwo, dass Microsoft wirklich wie zu nutzen BOM Informationen
  • lesen
  • sah in der Ausgabe versucht, die Datei als UCS-2 (anstelle von UTF-16), wie das ist (scheinbar), was BCP tatsächlich liest die Datei in als
  • versuchte -w auf dem bcp importieren, funktioniert das, aber nicht in Verbindung mit einer Lader-Format-Datei (ist es eine Möglichkeit, zu übernehmen, was Magie BCP sagt, dass die Datei in UTF-16 codiert wird, in die Format-Datei?)
  • Ich kann es an der Arbeit, wenn ich Ausgabe der Datei im Windows-1252 und dass die Codepage als -c 1252 Option angeben, um bcp, wenn ich die Datei laden (aber ich will nicht, dies zu tun, wie ich Informationen zu verlieren werde als UTF-16 ist ein Ober das, was im Vergleich zu 1252 dargestellt werden)

Hat jemand zu bekommen bcp Last in ein nvarchar Feld mit UTF-16-Daten in Verbindung mit einer Ladeformatkonfigurationsdatei verwaltet?

Vielen Dank im Voraus,

-James

War es hilfreich?

Lösung

Ich habe mit Antworten buchstäblich underwhelmed worden, aber ich habe es geknackt.

Die Loader-Datei Anforderungen mit einem -w Flag erzeugt werden, so dass der Befehl, um die Datei zu erzeugen, ist:

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

Dies führt zu einer Ladesteuerdatei, die ein wenig anders aussieht, erhalten Sie Einträge wie:

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

Beachten Sie das Trennzeichen als |\0|\0 aufgelistet, entsprechen die Nullen auf den zusätzlichen Byte in der Datei als UTF-16 (oder nur „Unicode“, wie Microsoft (fälschlicherweise) es nennt) ist eine Double-Byte-Zeichencodierung.

Einige Hinweise für die geistige Gesundheit von jemand anderem Umgang mit BCP auf diese Weise:

  • Wenn SQLServer spricht von "native" sie bedeuten nativen Zeichen, das heißt akzentuierte Zeichen
  • Wenn SQLServer spricht von Unicode, was sie bedeuten eigentlich die UTF16 (Little Endian) Art und Weise der Codierung der Unicode characterset . Dies ist, was die -w bezieht sich auf
  • Beim Schreiben eine Datei zum Laden in BCP mit UTF-16, die Datei in UTF-16 Little Endian-Format sein muss, und kann keine UTF BOM enthält (als BCP dies einen Byte interpretiert, die geladen werden sollen, und die ersten Datensatz wird die Stückliste enthalten, urgh!)

Der Java-Code für das Schreiben aus einer Datei in UTF-16, die auf diese Weise geladen werden können, ist wie folgt:

    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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top