1

UTF-8としてエンコードされたxmlがあり、これをSQLServerのテキストフィールドに書き込みたいと思います。UTF-8はTextとバイト互換であるため、これを実行して、後でutf-8としてエンコードされたxmlを読み取ることができるはずです。

ただし、UTF-8でマルチバイトであるÄÅÖなどの特殊文字は途中で変更されます。

私はこのようなコードを持っています:

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();

私の推測では、xmlバイト配列をstringに変更すると、特殊文字がUTF-16文字に変更され、その後、再びLatin1に変更されます。また、Latin1ÖÄÅはUTF-8ÖÄÅと同じではありません。

UTF-8 xmlバイトを変更せずにテキストフィールドに書き込むにはどうすればよいですか?

4

4 に答える 4

3

私が仕事に取り掛かった解決策は、myXmlパラメーターがVarbinary(Max)になるようにストアドプロシージャを変更することでした。これにより、バイト配列を渡すことができました。次に、SPでVarbinary(max)をVarchar(max)にキャストします。これにより、UTF-8に必要なバイトが保持されます

SET myXMLText = CAST(myXMLBinary as VARCHAR(MAX))
于 2010-05-26T08:23:05.087 に答える
3

列をNTextまたはNVarcharとして定義します

于 2010-05-21T15:23:00.077 に答える
0

UTF-8を格納する場合は、バイナリを使用します。テキストはUTF-16として内部的に格納されるためです。

于 2010-05-21T15:21:14.370 に答える
0

XMLであり、SQL Server 2005以降を使用している場合は、XML列タイプを使用してください。VARCHAR(MAX)やNVARCHAR(MAX)よりも高速でコンパクトであり、XMLスキーマに関連付けることができるため、有効なXMLのみが格納されていることを検証できます。

なんらかの理由でXML列タイプを使用できない場合は、少なくともVARCHAR(MAX)またはNVARCHAR(MAX)のTEXTを削除してください。TEXT / NTEXTは非推奨になり、廃止されます。さらに、(N)VARCHAR(MAX)を使用すると、TEXT/NTEXTでは機能しない通常の文字列関数もすべて取得できます。

于 2010-05-21T16:01:21.467 に答える