Pergunta

O meu banco de dados MySQL pode armazenar o símbolo do euro, apenas a de multa (como eu testei com um nativo MySQL client (HeidiSQL)).Mas com o MySQL .NET conector meu ASP.NET o aplicativo está usando eu não posso inserir nem lê-lo novamente a partir do banco de dados:Eu só ter um ?personagem de volta.O que poderia ser a causa?

Foi útil?

Solução

Eu sugiro especificar explicitamente a codificação em sua string de conexão:

Servidor = localhost; banco de dados = schema; uid = foo; pwd = bar;Charset = utf8;

Geralmente resolve a maioria dos problemas relacionados à codificação com o conector/rede do MySQL.

Outras dicas

Eu diria que o MySQL .NET conector define o agrupamento de variáveis de ambiente relacionadas à conexão;compare resultado destas consultas, tanto sobre os HeidiSQL e .NET:

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

Todos eles devem conter utf8-algo.Se não, você pode alterá-los em tempo de execução como no manual de.

O seguinte comando .NET pode codificá -los para o seu banco de dados e depois decodificá -los no símbolo original ...

System.Web.HttpUtility.HtmlEncode()

System.Web.HttpUtility.HtmlDecode()

Presumivelmente, você está inserindo o sinal do euro em um campo digitado como Nvarchar ou não seria capaz de inserir e recuperar o sinal do euro corretamente com outros clientes?

Você está usando a sintaxe correta em suas instruções SQL para inserção e recuperação de dados Unicode?

Para fazer isso, você deve usar o caractere N especificador antes de qualquer string que seja unicode ou será silenciosamente convertida em uma única codificação de byte e se tornará um personagem ilegível, por exemplo,

//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...

Eu tive um problema semelhante, tentando importar dados do Sybase 12.5 para o MS SQL Server 2005.

Basicamente, o MSSQL armazena sinais de £ e euro bem em Varchar se eles são codificados corretamente, o que é ótimo, mas o que eu não percebi é que Sybase estava produzindo os dados como Windows-1252 (Europeia Ocidental) e não UTF-8 e isso causou dados como £ e o símbolo do euro ser traduzido pelo programa de importação como '?'. Informando ao programa de importação que os dados recebidos são codificados como 1252 corrigidos o problema.

Se você codificar a saída do banco de dados como 1252 ao ler, você deve obter os símbolos certos.

Por exemplo:

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"))));
    ...
}

Você definiu corretamente o charset na sua página de saída? ou seja, algo como <META http-equiv="Content-Type" content="text/html; charset=UTF-8">ou charset=iso-8859-15 mas não charset=iso-8859-1

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top