Проблемы кодирования текста в MySQL C # - PullRequest
15 голосов
/ 03 июня 2009

У меня есть старая база данных MySQL с кодировкой UTF-8. Я использую Ado.Net Entity Framework для подключения к нему.

Строка, которую я извлекаю из нее, содержит странные символы, когда ожидаются подобные символы.

Например: «ë» - это «Ã« ».

Я думал, что смогу сделать это правильно, преобразовав UTF8 в UTF16.

 return Encoding.Unicode.GetString(                
            Encoding.Convert(
            Encoding.UTF8,
            Encoding.Unicode,
            Encoding.UTF8.GetBytes(utf8)));
    }

Это, однако, ничего не меняет.

Как я могу получить данные из этой базы данных в правильном виде?

Ответы [ 5 ]

35 голосов
/ 28 ноября 2011

Для поддержки UTF-8 в работе фрейма ADO.NET Entity (или вообще с использованием MySQL .NET Connector) необходимо сделать две вещи:

  1. Убедитесь, что сопоставление вашей базы данных таблицы является сопоставлением UTF-8 (т.е. utf8_general_ci или одно из его отношений)
  2. Добавьте Charset=utf8; в строку подключения.

    "Server=localhost;Database=test;Uid=test;Pwd=test;Charset=utf8;"
    

Я не уверен, но кодировка может быть чувствительной к регистру; Я обнаружил, что CharSet=UTF8; не работает для меня.

3 голосов
/ 03 июня 2009

Даже если для базы данных задано значение UTF8, для правильной работы полей Unicode необходимо выполнить следующие действия:

  1. Убедитесь, что вы используете тип поля Unicode, например NVARCHAR или TEXT CHARSET utf8
  2. Всякий раз, когда вы вставляете что-либо в поле, вы должны поставить перед ним символ N, чтобы указать данные Unicode, как показано в примерах ниже
  3. Всякий раз, когда вы выбираете на основе данных Unicode, убедитесь, что вы снова используете префикс N

MySqlCommand cmd = new MySqlCommand("INSERT INTO EXAMPLE (someField) VALUES (N'Unicode Data')");

MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM EXAMPLE WHERE someField=N'Unicode Data'");

Если база данных была настроена неправильно или данные были вставлены без использования префикса N, невозможно будет получить правильные данные, поскольку они будут переведены в набор символов Latin 1 / ASCII

1 голос
/ 06 июня 2009

Как уже говорили другие, это может быть проблема с БД, но она также может быть вызвана использованием старой версии коннектора .net mysql.

На самом деле я хотел прокомментировать преобразование utf8 в utf16. Строка, которую вы пытаетесь преобразовать, на самом деле уже закодирована в кодировке Unicode, поэтому ваши символы «Ã« »на самом деле занимают 4 байта (или больше) и больше не представляют собой искажение символа« ë »в момент преобразования Вот почему ваше обращение ничего не делает. Если вы хотите выполнить такое преобразование, я думаю, вам придется кодировать вашу строку utf8 как старый байт по 1 байту на строку символов, используя кодовую страницу, где байтовые значения Ã и «фактически представляют последовательность байтов utf8 ë, а затем обрабатывать байты этой новой строки как строку utf8. Прикольные вещи.

1 голос
/ 03 июня 2009

Попробуйте установить кодировку с помощью запроса "set names utf8". Вы также можете установить этот параметр в конфигурации MySQL.

0 голосов
/ 04 июля 2013

спасибо, Рот Коровы, Ваше решение работает, но все же нам нужно преобразовать символы. я думаю это твоя проблема :) и для преобразования символов вы можете использовать этот код

 System.Text.Encoding utf_8 = System.Text.Encoding.UTF8;

 string s = "unicode";

 //string to utf
 byte[] utf = System.Text.Encoding.UTF8.GetBytes(s);

 //utf to string
 string s2= System.Text.Encoding.UTF8.GetString(utf);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...