Erstellen Sie eine Datei in Java zum Laden in ein nvarchar Feld in SQL Server 2005 unter Verwendung von BCP und UTF-16
-
20-09-2019 - |
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:
-
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
) -
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();
-
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
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();