Проблемы с кодированием MySQL С#

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

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

Например: "ë" - "Ã" ".

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

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

Это ничего не меняет.

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

  • Убедитесь, что вы используете тип поля Unicode, такой как NVARCHAR или TEXT CHARSET utf8
  • Всякий раз, когда вы вставляете что-либо в поле, вы должны префикс его символом N, чтобы указать данные Unicode, как показано в примерах ниже.
  • Всякий раз, когда вы выбираете на основе данных 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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

 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);