Créez un fichier en Java pour le chargement dans un champ nvarchar en SQLServer 2005 en utilisant BCP et UTF-16

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

Question

Je veux utiliser BCP pour charger dans une table SQL Server 2005 avec un champ nvarchar en utilisant un fichier de contrôle du chargeur. Si je comprends bien, SQL Server 2005 prend en charge que UTF-16 (et je crois qu'il est UTF-16 LE). Le fichier est sortie par un programme Java. La façon dont je l'ai actuellement mis en place est la suivante:

  1. Un format XML fichier BCP chargeur (créé à l'aide de la commande suivante: bcp test_table format nul -c -x -T -f test_table.xml -S server)

  2. Un programme Java en utilisant le code suivant pour écrire la sortie:

    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. Ensuite, en utilisant la commande suivante bcp:
    bcp test_table in from_java.txt -T -f test_table.xml -S server -error error.txt

Ce que je reçois dans le tableau est ÿþá. et non áááááLittle Endian, BOM

Je l'ai essayé quelques permutations différentes de modifier les paramètres:

  • changer la façon dont je produis le fichier de contrôle du chargeur (en utilisant -n pour les données natives au lieu de -c pour les données de caractère ... Je pense que cela peut avoir quelque chose à voir avec elle, mais je ne voyais pas d'amélioration dans mon données insérées)
  • a essayé plusieurs différentes formes de codage UTF-16, y compris big endian et little endian sans nomenclature, sans résultat
  • a essayé de sortir la nomenclature manuellement dans le fichier que je l'ai lu quelque part que Microsoft comme vraiment utiliser les informations de nomenclature
  • examiné en essayant de sortir le fichier UCS-2 (au lieu de UTF-16) qui est (apparemment) ce que BCP est en train de lire le fichier en tant que
  • a essayé -w sur l'importation de bcp, cela fonctionne, mais pas en même temps avec un format de fichier de chargement (est-il un moyen d'intégrer tout ce que la magie dit BCP que le fichier est encodé en UTF-16 dans le fichier de format?)
  • je peux l'obtenir pour travailler si je sortie le fichier dans Windows 1252 et préciser que codepage comme option -c 1252 bcp lorsque je charge le fichier (mais je ne veux pas faire ce que je vais perdre information UTF-16 est un ensemble de ce qui peut être représenté par rapport à 1252)

Quelqu'un at-il réussi à obtenir bcp à charger dans un champ nvarchar à l'aide des données UTF-16 en liaison avec un fichier de configuration de format du chargeur?

Merci à l'avance,

-James

Était-ce utile?

La solution

Je suis littéralement underwhelmed avec des réponses, mais je l'ai craqué.

Le fichier de chargement doit être généré avec un drapeau de -w, de sorte que la commande pour générer le fichier est le suivant:

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

Cela conduit à un fichier de contrôle du chargeur qui ressemble un peu différent, vous obtenez des entrées telles que:

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

Notez que le séparateur est répertorié comme |\0|\0, les zéros correspondent à l'octet supplémentaire dans le fichier en UTF-16 (ou tout simplement « unicode » comme Microsoft (à tort) l'appeler) est un codage de caractères à deux octets.

Quelques notes pour la santé mentale de toute personne traitant d'autre avec BCP de cette façon:

  • Lorsque les négociations SQLServer de « indigène », ils entendent des caractères natifs, à savoir les caractères accentués
  • Lorsque les négociations SQLServer d'Unicode, ce qu'ils veulent dire en fait est la manière UTF16 (Little Endian) de codage Unicode characterset . C'est ce que le -w se rapporte à
  • Lors de l'écriture d'un fichier pour le chargement dans BCP en UTF-16, le fichier doit être en UTF-16 format peu Endian et ne peut pas contenir une nomenclature UTF (comme BCP interprétera ce un octet qui doit être chargé et votre premier enregistrement contiendra la nomenclature, urgh!)

Le code Java pour écrire un fichier en UTF-16 qui peut être chargé de cette façon est la suivante:

    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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top