Записать utf-8 в текстовое поле сервера sql с помощью ADO.Net и поддерживать байты UTF-8 - PullRequest
1 голос
/ 21 мая 2010

У меня есть некоторый xml, закодированный как UTF-8, и я хочу записать это в текстовое поле в SQL Server. UTF-8 является байтово-совместимым с текстом, поэтому он должен быть в состоянии сделать это, а затем прочитать xml, все еще закодированный как utf-8.

Однако специальные символы, такие как ÄÅÖ, которые являются многобайтовыми в 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 на строку специальные символы заменяются на символы UTF-16, которые затем снова заменяются на Latin1. И Latin1 ÖÄÅ - это не то же самое, что UTF-8 ÖÄÅ.

Как записать XML-байты UTF-8 в текстовое поле без их изменения?

Ответы [ 4 ]

3 голосов
/ 26 мая 2010

Решение, которое я получил, состояло в том, чтобы изменить хранимую процедуру так, чтобы параметром myXml был Varbinary (Max), что позволило мне передать байтовый массив. Затем в SP я применяю Varbinary (max) к Varchar (max). Это сохраняет байты, как требуется для UTF-8

SET myXMLText = CAST(myXMLBinary as VARCHAR(MAX))
2 голосов
/ 21 мая 2010

Определите ваш столбец как NText или NVarchar

0 голосов
/ 21 мая 2010

Если это XML и если вы используете SQL Server 2005 и выше - используйте тип столбца XML! Он быстрее, он более компактен, чем VARCHAR (MAX) или NVARCHAR (MAX), вы можете связать его со схемой XML и, таким образом, проверить, хранится ли только действительный XML ... только преимущества!

Если вы не можете использовать тип столбца XML по какой-либо причине, то , пожалуйста, хотя бы опустите ТЕКСТ для VARCHAR (MAX) или NVARCHAR (MAX)! TEXT / NTEXT устарела и исчезнет - плюс, с (N) VARCHAR (MAX), вы также получите все обычные строковые функции, которые не работают в TEXT / NTEXT.

0 голосов
/ 21 мая 2010

, если вы хотите хранить UTF-8, используйте двоичный файл, потому что текст хранится внутри как UTF-16

...