2010-05-21 7 views
0

J'ai un fichier XML codé en UTF-8 et je veux l'écrire dans un champ de texte dans SQL Server. UTF-8 est octet compatible avec le texte, il devrait être capable de le faire et ensuite lire le xml plus tard encore encodé comme utf-8.Ecrit UTF-8 dans un champ SQL Texte utilisant ADO.Net et conserve les octets UTF-8

Cependant, des caractères spéciaux tels que "Å", qui sont multi-octets en UTF-8, sont modifiés en cours de route.

J'ai code comme ceci:

byte[] myXML = ... 

SqlCommand _MyCommand = new SqlCommand(storeProcedureName, pmiDB.GetADOConnection()); 
_MyCommand.CommandType = CommandType.StoredProcedure; 
_MyCommand.Parameters.Add("xmlText", SqlDbType.Text); 
_MyCommand.Parameters["xmlText"].Value = Encoding.UTF8.GetString(myXML); 
_MyCommand.ExecuteNonQuery(); 

Je pense que la modification du tableau d'octets xml à chaîne change les caractères spéciaux à caractères UTF-16 qui sont ensuite changés à nouveau à la Latin1. Et Latin1 ÖÄÅ ne sont pas les mêmes que UTF-8 ÖÄÅ.

Comment écrire les octets xml UTF-8 dans le champ Texte sans les modifier?

+0

Avez-vous déjà rencontré cet article? http://support.microsoft.com/kb/232580 –

+0

Merci Mike, malheureusement il semble surtout dire ne pas le stocker comme UTF-8 – Carrick

Répondre

2

La solution que j'ai eu à travailler était de changer la procédure stockée de sorte que le paramètre myXml était Varbinary (Max), ce qui m'a permis de passer dans le tableau d'octets. Ensuite, dans le SP, je lance le Varbinary (max) à Varchar (max). Cela préserve les octets requis pour UTF-8

SET myXMLText = CAST(myXMLBinary as VARCHAR(MAX)) 
0

si vous voulez stocker UTF-8 utiliser binaire alors, car le texte est stocké en interne au format UTF-16

+1

Je pense que c'est juste NText qui stocke des caractères comme UCS-2. Le texte stocke les caractères sous la forme d'octets uniques. – Carrick

2

Définissez votre colonne comme NText ou nvarchar

+0

La table db est déjà définie et utilisée, donc je ne peux pas la changer. – Carrick

0

Si c'est XML et si vous êtes sur SQL Server 2005 et plus - utilisez le type de colonne XML! C'est plus rapide, c'est plus compact que VARCHAR (MAX) ou NVARCHAR (MAX), vous pouvez l'associer à un schéma XML et ainsi valider que seul le XML valide est stocké .... seuls les avantages!

Si vous ne pouvez pas utiliser le type de colonne XML pour une raison quelconque, alors veuillez au moins au moins déposer le texte pour VARCHAR (MAX) ou NVARCHAR (MAX)! TEXT/NTEXT est obsolète et disparaîtra - plus, avec (N) VARCHAR (MAX), vous obtenez également toutes les fonctions de chaînes habituelles, qui ne fonctionnent pas sur TEXT/NTEXT.

+0

J'aimerais utiliser le type xml mais malheureusement nous avons besoin de la possibilité de stocker des données dans tous les formats. Varbinary aurait été le meilleur ... – Carrick