Проблемы с кодированием 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):
Я не уверен, но кодировка может быть чувствительной к регистру; Я обнаружил, что 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);