Записать utf-8 в текстовое поле сервера sql, используя ADO.Net, и поддерживать байты UTF-8.
У меня есть некоторые 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 ответа
Решение, которое я получил, состояло в том, чтобы изменить хранимую процедуру так, чтобы параметром myXml был Varbinary(Max), что позволило мне передать байтовый массив. Затем в SP я применяю Varbinary(max) к Varchar(max). Это сохраняет байты, как требуется для UTF-8
SET myXMLText = CAST(myXMLBinary as VARCHAR(MAX))
Если вы хотите хранить UTF-8, используйте двоичный файл, потому что текст хранится внутри как UTF-16
Если это XML и если вы используете SQL Server 2005 и выше - используйте тип столбца XML! Он быстрее, он более компактен, чем VARCHAR(MAX) или NVARCHAR(MAX), вы можете связать его со схемой XML и, таким образом, проверить, хранится ли только действительный XML... только преимущества!
Если вы не можете использовать тип столбца XML по какой-либо причине, пожалуйста, по крайней мере, удалите текст для VARCHAR(MAX) или NVARCHAR(MAX)! TEXT/NTEXT устарела и исчезнет - плюс, с (N)VARCHAR(MAX), вы также получите все обычные строковые функции, которые не работают в TEXT/NTEXT.