par
devlop78 » 28 déc. 2010, 21:12
C'est assez simple en fait :p
Tu as l'encodage x de ta table (la collation, en s'en fiche pour le moment), l'encodage y du transfert entre php(y)->mysql(x) et mysql(x)->mysql(y), et z l'encodage de ta page.
Le tout est de faire en sorte que tous soient en harmonie.
Tu règles x avec ton ALTER TABLE ...
Tu règles y avec "set names y"
Tu règles z avec un header() et/ou un meta-equiv (qui comme son nom l'indique, équivaut en quelque sorte à un header). D'après des tests que j'ai pu faire, et contrairement à ce que j'avais pu lire sur le net, meta-equiv et header() ne sont pas plus "fort" l'un ou l'autre : c'est tout simplement utf-8 qui prend le dessus. Mais par logique, ils doivent être les mêmes. Car tu ne t'appelles pas John et Samantha ...
Cas de figure :
Tu utilises utf-8 sous mysql, et utf-8 côté php, et utf-8 coté html : x, y et z sont en utf-8
Tu utilises utf-8 sous mysql, et latin1 côté php et html : x est en utf-8, et y et z sont en latin1
Tu utilises utf-8 sous mysql, latin1 coté php et utf8 coté html : x est en utf-8, y est en latin1 et z en utf-8, mais bien penser à faire les conversions avant envoi et après reception à la base de données, et au navigateur.
Enfin, en résumé, "set names" permet de préciser à MySQL avec quel encodage tu communiques avec lui (et non celui qu'il utilises, car ça, il le sait déjà), ce qui lui permet de faire, ou non, le transcodage de son côté lorsque tu lui envoies de données, et lorsqu'il t'en envoie.
Malgré toute la maitrise que l'on peut avoir dans l'encodage, il est quand même préférable d'utiliser le même. En plus, iso-8859-1 est un traitre car lorsqu'un utilisateur sous windows remplit des questionnaires sous iso-8859-1, il insère sans aucun problème des signes tels que l'euro, qui rappelons-le, n'existe pas en iso-8859-1. Il en est de même pour MAC, qui insère (là c'est plus une hypothèse mais d'une expérience subie) des caractères très proches de l'iso visuellement mais propre à MAC. Et le pire (Quoique), c'est que le signe euro enregistré sous iso-8859-1 (non enregistré sous le code ASCII étendu "euro" car iso-8859-1 n'en possède pas), s'affiche pépère dans la page HTML, même sous Linux, par exemple. Sous MAC, je ne sais pas. En gros, tu dis à ton navigateur de lire de l'iso-8859-1, mais lui, il lit de l'AINSI. Utf-8 a l'avantage de mettre tout le monde d'accord.
C'est assez simple en fait :p
Tu as l'encodage x de ta table (la collation, en s'en fiche pour le moment), l'encodage y du transfert entre php(y)->mysql(x) et mysql(x)->mysql(y), et z l'encodage de ta page.
Le tout est de faire en sorte que tous soient en harmonie.
Tu règles x avec ton ALTER TABLE ...
Tu règles y avec "set names y"
Tu règles z avec un header() et/ou un meta-equiv (qui comme son nom l'indique, équivaut en quelque sorte à un header). D'après des tests que j'ai pu faire, et contrairement à ce que j'avais pu lire sur le net, meta-equiv et header() ne sont pas plus "fort" l'un ou l'autre : c'est tout simplement utf-8 qui prend le dessus. Mais par logique, ils doivent être les mêmes. Car tu ne t'appelles pas John et Samantha ...
Cas de figure :
Tu utilises utf-8 sous mysql, et utf-8 côté php, et utf-8 coté html : x, y et z sont en utf-8
Tu utilises utf-8 sous mysql, et latin1 côté php et html : x est en utf-8, et y et z sont en latin1
Tu utilises utf-8 sous mysql, latin1 coté php et utf8 coté html : x est en utf-8, y est en latin1 et z en utf-8, mais bien penser à faire les conversions avant envoi et après reception à la base de données, et au navigateur.
Enfin, en résumé, "set names" permet de préciser à MySQL avec quel encodage tu communiques avec lui (et non celui qu'il utilises, car ça, il le sait déjà), ce qui lui permet de faire, ou non, le transcodage de son côté lorsque tu lui envoies de données, et lorsqu'il t'en envoie.
Malgré toute la maitrise que l'on peut avoir dans l'encodage, il est quand même préférable d'utiliser le même. En plus, iso-8859-1 est un traitre car lorsqu'un utilisateur sous windows remplit des questionnaires sous iso-8859-1, il insère sans aucun problème des signes tels que l'euro, qui rappelons-le, n'existe pas en iso-8859-1. Il en est de même pour MAC, qui insère (là c'est plus une hypothèse mais d'une expérience subie) des caractères très proches de l'iso visuellement mais propre à MAC. Et le pire (Quoique), c'est que le signe euro enregistré sous iso-8859-1 (non enregistré sous le code ASCII étendu "euro" car iso-8859-1 n'en possède pas), s'affiche pépère dans la page HTML, même sous Linux, par exemple. Sous MAC, je ne sais pas. En gros, tu dis à ton navigateur de lire de l'iso-8859-1, mais lui, il lit de l'AINSI. Utf-8 a l'avantage de mettre tout le monde d'accord.