Возникли проблемы с хранением UTF-8 в NVarChar в SQL Server 2008
Я тяну данные с помощью System.Net.WebClient
с веб-сайта, и когда данные возвращаются, все анализируется и выглядит хорошо, кроме букв с акцентами. Например, когда он возвращает é
SQL Server 2008 сохраняет его как é
,
Просто нужно выяснить, как преобразовать эти символы UTF-8 во что-то, что SQL Server может читать. Я храню это в NVARCHAR(MAX)
тип данных.
Я использую Linq-to-SQL для вставки в базу данных, если вам интересно.
Любые мысли о том, что я мог бы сделать, чтобы преобразовать его в правильный формат?
2 ответа
Догадаться! При использовании класса WebClient я загружал данные в виде строки.
Моя оригинальная конфигурация...
System.Net.WebClient wc = new WebClient();
string htmlData = wc.DownloadString(myUri);
Я пытался преобразовать эти данные в UTF-16... из его текущей строки, но поскольку Microsoft работает в UTF-16, она сама выполнила преобразование.
Вместо этого я переключился на чтение фактического массива byte[] из данных, например, так...
System.Net.WebClient wc = new WebClient();
string htmlData = UTFConvert(wc.DownloadData(myUri));
private string UTFConvert(byte[] utfBytes)
{
byte[] isoBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utfBytes);
return Encoding.Unicode.GetString(isoBytes);
}
Это решило проблему, и теперь SQL правильно видит акценты во всем. Yippee.
Приветствую всех, и спасибо за вашу помощь!
Описание хранения данных UTF-8 в SQL Server. Эта тема также обсуждается в разделе " Международные функции" в Microsoft SQL Server 2005. Суть этого такова: SQL Server не поддерживает UTF-8. Не стесняйтесь подавать запрос на добавление поддержки для естественного хранения UTF-8 в SQL Server.
Однако, как примечание, поскольку вы сохраняете строку Unicode через LINQ, это указывает на то, что проблема возникает до записи в SQL Server. А именно, тянет ли ваш веб-сайт, правильно ли он конвертирует данные, считанные с помощью считывателя UTF-8? А именно, вы читаете WebResponse.GetResponseStream()
через StreamReader
построен с соответствующим UTF8Encoding
? Это должно создать правильную строку Unicode, и тогда хранилище NVARCHAR в БД (которое является UCS-2) должно быть в порядке.