Crear un archivo en Java para la carga en un campo nvarchar de SQL Server 2005 utilizando BCP y UTF-16

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

Pregunta

Quiero utilizar BCP para cargar en una tabla de SQL Server 2005 con un campo nvarchar mediante un archivo de control de la cargadora. Como yo lo entiendo, SQL Server 2005 sólo es compatible con UTF-16 (y yo creo que es UTF-16 LE). está siendo el archivo de salida por un programa Java. La forma en que lo tengo configurado actualmente es el siguiente:

  1. Un archivo BCP cargador formato XML (creada mediante el siguiente comando: bcp test_table format nul -c -x -T -f test_table.xml -S server)

  2. Un programa Java utilizando el código siguiente para escribir el resultado:

    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. A continuación, utilizando el siguiente comando bcp:
    bcp test_table in from_java.txt -T -f test_table.xml -S server -error error.txt

Lo que pongo en la mesa es ÿþá. y no áááááLittle Endian, BOM

He intentado un par de permutaciones diferentes de cambio de parámetros:

  • cambiar la forma en que genero el archivo de control de la cargadora (usando -n para datos nativos en vez de -c para los datos de carácter ... creo que esto puede tener algo que ver con ello, pero no ve ninguna mejoría en mi datos insertados)
  • trató varias formas diferentes de la codificación UTF-16, incluyendo big endian y little endian sin BOM, en vano
  • trató de salida de la lista de materiales manualmente en el archivo como he leído en alguna parte que Microsoft realmente les gusta hacer uso de la información de lista de materiales
  • mirado en tratar de generar el archivo como UCS-2 (en lugar de UTF-16) ya que es (aparentemente) lo BCP en realidad está leyendo el archivo como
  • -w trató sobre la importación BCP, este trabajo lo hace, pero no en conjunción con un archivo de formato cargador (¿hay una manera de incorporar cualquier magia dice BCP que el archivo está codificado en UTF-16 en el archivo de formato?)
  • Me puede conseguir que funcione si la salida que el archivo en Windows-1252 y especifique que la página de códigos como una opción -c 1252 a bcp cuando cargo el archivo (pero no quiero hacer esto, ya que van a perder información UTF-16 es un superconjunto de lo que puede ser representado en comparación con 1252)

¿Alguien consiguió BCP para cargar en un campo nvarchar usando UTF-16 de datos en conjunción con un formato de archivo de configuración del cargador?

Gracias de antemano,

-James

¿Fue útil?

Solución

He estado literalmente insuficiente con las respuestas, pero he agrietado.

El archivo del cargador debe ser generado con una bandera -w, por lo que el comando para generar el archivo es:

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

Esto conduce a un archivo de control de la cargadora que se ve un poco diferente, se obtiene entradas tales como:

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

Tenga en cuenta el delimitador aparece como |\0|\0, los ceros se corresponden con el byte adicional en el archivo como UTF-16 (o simplemente "Unicode", como Microsoft (erróneamente) llamarlo) es una doble codificación de caracteres de bytes.

Algunas notas para la cordura de cualquier otra persona trata de BCP de esta manera:

  • Cuando se habla de SQLServer "nativo" que significan caracteres nativos, es decir, los caracteres acentuados
  • Cuando se habla de SQL Server de Unicode, lo que realmente quieren decir es la UTF16 (Little Endian) de manera de codificar la Unicode juego de caracteres . Esto es lo que el -w se refiere a
  • Al escribir un archivo para cargarlo en el BCP con UTF-16, el archivo tiene que estar en formato little endian UTF-16, y no puede contener una lista de materiales UTF (BCP interpretará esto un byte que debe ser cargado y su primera registro contendrá la lista de materiales, urgh!)

El código Java para escribir un archivo en UTF-16 que se puede cargar de esta manera es el siguiente:

    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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top