1 Dernière modification par Nardo26 (14-01-2011 17:44:14)

Sujet : Base SQL et UTF-8 [Résolu]

Bonsoir,
Je ne sais pas trop où poster mon problème:  je soupçonne un problème au niveau de ma base SQL...

Petit topo :
Je viens de passer l'ensemble de mon site en UTF-8. Je ne rencontre pas de problème d'accents dans le contenu de mes pages. Sur chaque page, je donne la possibilité de laisser des commentaires.
Lorsque je crée un nouveau commentaire, les accents sont bien gérés. l'affichage est ok.
Par contre, je constate que sur les anciens messages les caractères sont remplacés par des accents...
Lorsque je regarde le contenu dans mySQL, les accents sont pourtant bien présents.

Lors du passage en UTF-8, j'avais le champs de commentaire (de type TEXT) qui était en latin1_general_ci, j'ai édité (à partir de l'onglet 'structure') mon champs en le faisant passer en utf8_general_ci. Ai-je bien fait ? il y a t-il une manip que j'aurais loupé ?

Merci de vos réponses ! smile

[Edit]

J'ai constaté que maintenant lorsque je poste un nouveau message dans mes pages, les accents sont remplacés par exemple par &eacute, &agrave, etc...
Comme je ne maîtrise pas vraiment SQL, Existe-t-il un moyen (une requête) pour remplacer dans la base tout les accents par leurs versions "html" ou dois-je me coltiner toutes les modifs à la main ? sad

[/Edit]

2

Re: Base SQL et UTF-8 [Résolu]

Bonjour
Tu peux le faire avec

echo htmlentities($valeur, ENT_QUOTES, "UTF-8");

$valeur == a remplacer par ce que tu récupères dans ta base de données

3 Dernière modification par Nardo26 (12-01-2011 12:45:40)

Re: Base SQL et UTF-8 [Résolu]

Merci Nico,

Je comprend plus rien du tout !!!

Je viens de faire plusieurs essais avec la chaîne "caractères" :

Ce que je récupère dans $_POST :   caractère
Si je conserve les html_entity, cela va me remplir la base de caractères inutiles (alors qu'elle est elle-même en UTF-8.

Donc avant la requête INSERT, j'ai rajouté ceci pour me retrouver avec une chaine codée en UTF-8 (sans les html_entity,  c'est franchement plus lisible wink ...)

$texte_form = $_POST['texte_form'];
$texte_form = html_entity_decode($texte_form,ENT_NOQUOTES,"UTF-8");

A ce stade, la chaîne est correctement affichée dans le navigateur. Par contre, si je regarde dans mySQL, je me retrouve avec ceci : Caractères

???? bizarre non ?

J'ai l'impression que lorsqu'un champ dans une base est crée, on ne peut plus changer son type d'encodage... c'est l'impression que cela donne...
Je me trompe ?

4 Dernière modification par Nardo26 (12-01-2011 21:32:00)

Re: Base SQL et UTF-8 [Résolu]

Bonsoir,

Un peu plus de détails smile

Après quelques essais j'ai trouvé une solution :

    $connection = mysql_connect($host, $user, $password);  // connexion a mySQL
    $db         = mysql_select_db($database, $connection); // selection de la base de donnee
    $rubrique=$_POST['rubrique'];
    $date = date('Y/m/d H:i');
    // On utilise mysql_real_escape_string et htmlspecialchars par mesure de sécurité
    $auteur_form= mysql_real_escape_string(htmlspecialchars($_POST['auteur_form']));
    $email_form= mysql_real_escape_string(htmlspecialchars($_POST['email_form']));
    // Le texte du commentaire est déjà passé pas htmlspecialchar
    $texte_form = $_POST['texte_form'];
    $table_entity=array("é","è","ç","ù","Ç","É","â","ê","ï","ë");
    $table_accent=array("é","è","ç","ù","Ç","É","â","ê","ï","ë");
    $texte_form=str_replace($table_entity,$table_accent,$texte_form);
    // On peut enfin enregistrer :o)
       $sql  = mysql_query('INSERT INTO '.$table.' (rubrique, auteur, email, texte, date) VALUES (\''.$rubrique.'\', \''.$auteur_form.'\', \''.$email_form.'\', \''.$texte_form.'\', \''.$date.'\')', $connection);

Dans ma page html cela fonctionne correctement :
http://nardo26.lescigales.org/img/Capture2.PNG
j'en ai profité pour vérifier si l'inclusion de balises est bien filtrée dans le champ de saisie wink


si je visualise le code à partir du navigateur j'ai:

<div class="message_body"><p>ceci est un test sur les &lt;b&gt;caractères accentués&lt;/b&gt;<br />fin du test !</p></div>

-> les accents sont ok !

Par contre dans ma base SQL j'ai ceci :
http://nardo26.lescigales.org/img/Capture.PNG

Quelqu'un pourrai m'expliquer pourquoi les caractères accentués ne s'affichent pas correctement dans la base ?
Je sais bien que les caractères sont codés sur 2 octets en UTF8 mais la page de mySQL est dans ce format donc ?... si non,  pourquoi seulement les accents et pas le reste du texte ?...

5

Re: Base SQL et UTF-8 [Résolu]

Je pense que phpmyadmin n'est pas réglé sur UTF8 il doit sûrement encoder autrement ce qui provoque ce "bug"
Essai de voir en changeant via le navigateur l'encodage

Re: Base SQL et UTF-8 [Résolu]

Bonsoir Nico,

J'ai vérifié, tout me semble ok : le 'character set database' est bien en utf8

http://nardo26.lescigales.org/img/Capture3.PNG

Bizarre, vous avez dis bizarre ? comme c'est bizarre !... big_smile

Re: Base SQL et UTF-8 [Résolu]

Bonjour,

Eurêka !! j'ai trouvé la solution :

Il ne suffit pas d'encoder la page html en UTF8 et de configurer la base de la même manière, il faut également préciser dans quel type d'encodage les requêtes doivent être effectuées.
En fait les connexions MySQL sont en ISO-8859-1 par défaut, et si les données sont marquées comme étant en UTF-8 alors MySQL va réaliser une conversion, corrompant ainsi les données...

Que ce soit en lecture ou en écriture, il faut donc rajouter ceci juste après la sélection de la base :
mysql_query("SET NAMES 'utf8'",$connection);

voir ceci:
http://forum.alsacreations.com/topic-17 … UTF-8.html

8

Re: Base SQL et UTF-8 [Résolu]

Bonsoir,

Oui effectivement je ne le précise nulle part mais pour des raisons historiques, je force le SET NAMES d'init de MySQL vers l'iso-8859-1.
Il faudra que je change cela vers de l'UTF-8 dans le futur mais comment régler ce problème sans gêner les sites existants..

lesCigales.ORG sysadm1n
L'hébergeur qui sent bon la lavande - Un control panel qu'il est chouette - Viendez nous parler!
"All that is necessary for evil to triumph is for good men to do nothing."

9 Dernière modification par Nardo26 (19-01-2011 18:20:26)

Re: Base SQL et UTF-8 [Résolu]

Bonsoir Toad,

A mon avis, il ne faut surtout pas toucher au SET NAME...

Car cela ne nous coute rien de rajouter une petite ligne pour les futurs développement...
(il faut juste noter cette histoire de utf8 dans un coin, c'est piégeux...) alors que pour les sites déjà existants, cela risque de générer un sacré merdi... et une foule de post de gens qui hurleront que leurs sites ne fonctionnent plus correctement. wink

... maintenant, ce que j'en pense...  wink

10

Re: Base SQL et UTF-8 [Résolu]

Oui c'est bien mon souci, on verra dans le temps, quand les gens seront connectés à plus d'1 serveur MySQL, dans ce cas le proxy MySQL pourra surement faire automatiquement le changement.

lesCigales.ORG sysadm1n
L'hébergeur qui sent bon la lavande - Un control panel qu'il est chouette - Viendez nous parler!
"All that is necessary for evil to triumph is for good men to do nothing."

11

Re: Base SQL et UTF-8 [Résolu]

@Nardo26

Tu m'as sauvé la vie !