2009-11-06 5 views
4

Ma base de données MySQL peut stocker le symbole de l'euro (comme j'ai testé avec un client MySQL natif (HeidiSQL)). Mais avec le connecteur MySQL .NET que mon application ASP.NET utilise, je ne peux pas l'insérer ni le relire depuis la base de données: j'ai seulement un? caractère de retour. Quelle pourrait être la cause possible?MySQL :: Connecteur/Signe euro net

+0

Peut-être déjà répondu ici aussi: http://stackoverflow.com/questions/1703636/how-to-store-euro-symbol-in-mysql-database – Gonzalo

Répondre

5

Je suggère explicitement spécifier l'encodage dans votre chaîne de connexion:

Serveur = localhost; Base de données = schéma; Uid = foo; Pwd = bar; CharSet = utf8;

Il résout généralement la plupart des problèmes liés à l'encodage avec Connector/NET de MySQL.

+2

ne fonctionnait pas pour moi – akosch

+0

Le paramètre charset affecte uniquement les requêtes envoyées à partir de l'application; le jeu de caractères des résultats renvoyés n'est pas affecté. Êtes-vous sûr que le classement de votre table contenant le symbole de l'euro est correct? Si vous mettez un signe euro dans une table marquée comme UTF-8 comme un octet incorrect, MySQL ne se plaindra pas (il ne collera pas correctement). Un client Unicode-naïve (peut-être HeidiSQL est?) Serait récupérer l'octet bien et le traiter à tort comme un euro, mais Connector/NET essaierait et ne parviendrait pas à le traiter comme UTF-8. – bobince

+0

J'utilise utf8_unicode_ci pour la table – akosch

0

La commande .Net suivante peut encoder ces pour votre base de données, puis les décoder dans le symbole d'origine ...

System.Web.HttpUtility.HtmlEncode() 

System.Web.HttpUtility.HtmlDecode() 
+6

Stockage HTML- encoder des chaînes dans la base de données est une très mauvaise idée.Les opérations de chaîne au niveau de la base de données comme les sous-chaînes et les comparaisons échoueront. Et HtmlEncode n'encadre pas les caractères Unicode en dehors de la plage latin-1 de toute façon. – bobince

-1

Avez-vous correctement défini le jeu de caractères dans votre page de sortie? dire quelque chose comme <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> ou charset=iso-8859-15 mais pas charset=iso-8859-1

+0

Sous iso-8859-1 Unicode € apparaîtra comme "â €", ce qui n'est certainement pas "?". – sanmai

2

Je dirais que le connecteur MySQL .NET définit certaines variables d'environnement liées classement sur la connexion; comparer la production de ces requêtes à la fois sur HeidiSQL et .NET:

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

Ils doivent contenir UTF8 quelque chose. Sinon, vous pouvez les modifier à l'exécution as in the manual.

0

Vous insérez probablement dans le signe euro dans un champ qui est tapé comme NVARCHAR ou vous ne seriez pas en mesure d'insérer et de récupérer le signe euro correctement avec d'autres clients?

Utilisez-vous la syntaxe correcte dans vos instructions SQL pour l'insertion et la récupération de données Unicode? Pour ce faire, vous devez utiliser le caractère spécificateur N avant toute chaîne qui est unicode ou il sera converti silencieusement en un codage à un seul octet et devenir un caractère illisible, par exemple.

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

J'ai eu un problème similaire, en essayant d'importer des données de Sybase 12.5 à MS SQL Server 2005.

magasins Fondamentalement MSSQL £ et signes euros d'amende en varchar si elles sont codées à droite, ce qui est génial , mais ce que je n'avais pas réalisé, c'est que Sybase fournissait les données sous Windows-1252 (Europe de l'Ouest) et non UTF-8, ce qui faisait que les données telles que £ et le symbole de l'euro étaient traduites par '?' Indiquer au programme d'importation que les données entrantes sont codées en tant que 1252 a résolu le problème.

Si vous codez la sortie de la base de données en tant que 1252 au cours de la lecture, vous devriez obtenir les bons symboles.

Par exemple:

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