Вопрос

Моя база данных MySQL прекрасно может хранить символ евро (как я тестировал с собственным клиентом MySQL (HeidiSQL)).Но с соединителем MySQL .NET, который использует мое приложение ASP.NET, я не могу ни вставить, ни прочитать его из базы данных:Я получаю только ?персонаж назад.Какая может быть возможная причина?

Это было полезно?

Решение

Я бы предложил явно указать кодировку в строке подключения:

Сервер = локальный хост; База данных = схема; Uid = foo; Pwd = bar;CharSet=utf8;

Обычно это решает большинство проблем, связанных с кодированием MySQL Connector/NET.

Другие советы

Я бы сказал, что соединитель MySQL .NET устанавливает некоторые переменные среды, связанные с сопоставлением, при соединении;сравните выходные данные этих запросов как в HeidiSQL, так и в .NET:

SHOW VARIABLES LIKE "character_set_%"; 
SHOW VARIABLES LIKE "collation_%";

Все они должны содержать что-то utf8.Если нет, вы можете изменить их во время выполнения. как в инструкции.

Следующая команда .Net может закодировать их для вашей базы данных, а затем декодировать в исходный символ...

System.Web.HttpUtility.HtmlEncode()

System.Web.HttpUtility.HtmlDecode()

Предположительно, вы вставляете знак евро в поле, которое напечатано как NVARCHAR, или вы не сможете правильно вставлять и получать знак евро с другими клиентами?

Используете ли вы правильный синтаксис в своих операторах SQL для вставки и получения данных Unicode?

Для этого вы должны использовать символ спецификатора N перед любой строкой, которая является Unicode, иначе она будет автоматически преобразована в однобайтовую кодировку и станет нечитаемым символом, например.

//Inserting Unicode data
MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = "INSERT INTO SOME_TABLE (someField) VALUES (N'@text')";
cmd.Parameters.Add("text", "Some Unicode Text");
cmd.Connection = conn;
cmd.ExecuteNonQuery();

//Selecting Unicode data
MySqlCommand select = new MySqlCommand();
select.CommandText = "SELECT * FROM SOME_TABLE WHERE someField=N'@text'";
cmd.Parameters.Add("text", "Some Unicode Text");
cmd.Connection = conn;
//Execute your query and process your Results...

У меня была аналогичная проблема при попытке импортировать данные из Sybase 12.5 в MS SQL Server 2005.

По сути, MSSQL прекрасно хранит знаки £ и евро в varchar, если они правильно закодированы, и это здорово, но я не осознавал, что Sybase выводит данные в формате Windows-1252 (западноевропейский), а не UTF-8, и это приводило к тому, что такие данные, как £ и символ евро, переводились программой импорта как «?».Проблема была устранена сообщением программе импорта о том, что входящие данные закодированы как 1252.

Если вы кодируете вывод из БД как 1252 во время его чтения, вы должны получить правильные символы.

Например:

System.Text.Encoding enc = System.Text.Encoing.GetEncoding(1252);
MySqlDataReader msdr = command.ExecuteReader();
while(msdr.Read())
{
    ...
    string val = enc.GetString(enc.GetBytes(msddr.GetString(mssdr.GetOrdinal("varhcar_field"))));
    ...
}

Правильно ли вы установили кодировку на выходной странице?то естьчто-то вроде <META http-equiv="Content-Type" content="text/html; charset=UTF-8">или charset=iso-8859-15 но нет charset=iso-8859-1

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top