J'ai un probleme d'affichage de characteres UTF8 tires de MySQL sur une page web.
Voila ce qui se passe
* J'ai une base de donnees, avec 2 tables, de provenance differente
les champs texte des 2 tables sont en UTF8 par defaut
* J'ai un script (perl CGI) qui affiche des champs de ces tables.
Dans les 2 cas, le charset est bien UTF8 dans les headers HTTP et dans la balise META de la page HTML generee.
Pour afficher tout ca, en debut de script j'execute
$_dbh->do("SET character_set_connection='utf8'");
$_dbh->do("SET NAMES 'utf8'");
$_dbh->do("SET CHARACTER SET 'utf8'");
Qui sont des raccourcis (My?)SQL pour en fait faire:
$_dbh->do("SET character_set_connection='utf8'");
$_dbh->do("SET character_set_database='utf8'");
$_dbh->do("SET character_set_client='utf8'");
$_dbh->do("SET character_set_results='utf8'");
$_dbh->do('SET collation_connection = @@collation_database');
Pour les moins Perleux d'entre vous, ca execute juste la requete SQL entre parentheses.
Bref, tout va bien dans le meilleur des mondes pour la premiere table.
Le probleme est que les caracteres UTF8 de la seconde ne s'affichent pas comme il faut (truc habituel de 2 caracteres bizarres cote a cote).
Si dans mon script je n'execute pas le
$_dbh->do("SET character_set_results='utf8'");
la 2eme table s'affiche bien, mais pas la premiere.
J'en deduis que la 1ere table est en bel UTF8 comme il faut, et que la deuxieme est en quelque chose d'autre, latin1 sans doute (valeur de toutes les variables SQL par defaut). Le probleme est que je n'ai pas reussi a convertir les champs de facon a les afficher correctement, malgre pas mal d'essais.
L'un de vous saurait-il comment faire ca, que ca soit une doc, une ligne de Perl ou de SQL (je doute que ca soit beacoup plus que ca...)
Merci d'avance
# Requête sql
Posté par Raphaël G. (site web personnel) . Évalué à 3.
Tu as une solution simple fait cette commande :
$_dbh->do('SET CHARSET UTF8;');
Traite ta première table.
Puis exécute :
$_dbh->do('SET CHARSET LATIN1;');
Et traite la second table.
Si tu veux convertir tes données pourrit sur ta table latin1 il y a une solution :
Si tu as du UTF8 affiché en latin1 (montre des Angstum : é), alors il faut faire ceci sur chaque champs a convertir :
ALTER TABLE table CHANGE champ champ BLOB;
ALTER TABLE table CHANGE champ champ TEXT CHARACTER SET UTF8;
Voir ce lien pour plus d'info :
http://www.developpez.net/forums/showpost.php?p=554185&p(...)
Les histoires ce utf8_unicode_ci c'est autre chose c'est pour des règles spéciale de collation (accords de mot, groupe de lettre, etc).
[^] # Re: Requête sql
Posté par lom (site web personnel) . Évalué à 1.
La premiere solution est possible, certes, mais c'est de la triche, et j'aimerai reussir a avoir une base propre, c'est a dire entierement UTF8.
La conversion etait tres tentante, mais ca ne marche pas.
Peut etre est-ce parce que j'ai des '‘' au lieu de 'é'?
En tout cas merci, ca me donne des pistes pour continuer.
[^] # Re: Requête sql
Posté par madko (site web personnel) . Évalué à 0.
SET NAMES 'utf8';
ça m'a souvent aidé mais mes scripts sont en php, donc jsais pas si ça va t'aider dans ton cas.
[^] # Re: Requête sql
Posté par madko (site web personnel) . Évalué à 1.
http://dev.mysql.com/doc/refman/5.0/en/charset.html
[^] # Re: Requête sql
Posté par lom (site web personnel) . Évalué à 1.
Le probleme est peut etre que je ne sais quel est le charset des donnees. La 2eme table est en UTF8, mais si les donnees de la table sont renvoyees en UTF8 (SET character_set_results='utf8') c'est la que j'ai des erreurs.
Il me faudrait un moyen de savoir quel est le charset des donnees, si tant est que ca veuille dire quelque chose.
En tout cas merci.
[^] # Re: Requête sql
Posté par madko (site web personnel) . Évalué à 0.
ça aussi ça a l'air interessant, mais bon ça a l'air un peu violent dans les manips qu'il utilise pour regler son probleme, mais bon ça peut donner quelques pistes
[^] # Re: Requête sql
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 1.
une base déclarée en UTF8 contenant des données UTF-8 qui avaient
étés traités en tant que données latin1 et donc reconverties (en clair un "é" prenait 4 octets dans la DB).
Avec un cgi en perl qui traitait si connectait à la base en latin1 mais qui affichait dans des pages UTF8 ça passait, par contre dès que tu
voulait nettoyer le bordel ///
ma 'solution' à été d'utiliser mysqldump + iconv pour obtenir des
données +/- correctes et de nettoyer a la main les bouts de codes restants.
[^] # Re: Requête sql
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 1.
fut: hexdump -C sur le fichier .MYD (en MyISAM).
J'ai analysé la sortie pour trouver une chaine avec accents que je connaissait et c'est la que j'ai vu qu'un accents prenait 4 octets au niveau stockage.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.