MySQL ::Connector/Net sinal de euro
-
18-09-2019 - |
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?
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