Возникли проблемы с хранением 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) должно быть в порядке.

Другие вопросы по тегам