Forum Programmation.SQL MySql, UTF8 (et peut-être Perl)

Posté par  (site web personnel) .
Étiquettes : aucune
0
4
fév.
2008
Hello,

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  (site web personnel) . Évalué à 3.

    Salut,

    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  (site web personnel) . Évalué à 1.

      Hello,

      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  (site web personnel) . Évalué à 0.

        Si t'es tables sont bien en utf8 c'est juste un probleme d'affichage, il faut donc dire a tes libs mysql que la connexion doit se faire en UTF8 avec la commande suivante:

        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  (site web personnel) . Évalué à 1.

          zut jviens de voir que tu l'a deja... un lien interessant pour me faire pardonner:

          http://dev.mysql.com/doc/refman/5.0/en/charset.html
        • [^] # Re: Requête sql

          Posté par  (site web personnel) . Évalué à 1.

          Bien essaye :o)

          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  (site web personnel) . Évalué à 0.

            http://www.oreillynet.com/onlamp/blog/2006/01/turning_mysql_(...)

            ç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  (site web personnel) . Évalué à 1.

            J'ai eu des problèmes similaires au tiens (enfin je pense):

            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  (site web personnel) . Évalué à 1.

            Ah si pour la question "quel est le charset des donnees", ma solution
            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.