Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utiliser utf8 ou non - Problème d'encodage de caractères MySQL et PHP

Votre problème est que votre SET NAMES 'utf8_persian_ci' la commande était invalide (utf8_persion_ci est un collage , pas un encodage ). Si vous l'exécutez dans un terminal, vous verrez une erreur Unknown character set: 'utf8_persian_ci' . Ainsi votre application, lorsqu'elle est stockée les données, utilisaient le latin1 jeu de caractères. MySQL a interprété votre entrée comme des caractères latin1 qu'il a ensuite stockés encodés en utf-8. De même, lorsque les données ont été extraites, MySQL les a reconverties d'UTF-8 en latin1 et (espérons-le, la plupart du temps) les octets d'origine que vous lui avez donnés.

En d'autres termes, toutes vos données dans la base de données sont complètement foirées, mais il se trouve que cela a fonctionné.

Pour résoudre ce problème, vous devez annuler ce que vous avez fait. Le moyen le plus simple consiste à utiliser PHP :

  1. SET NAMES latin1;
  2. Sélectionnez chaque champ de texte de chaque table.
  3. SET NAMES utf8;
  4. Mettez à jour les mêmes lignes en utilisant la même chaîne sans modification.

Vous pouvez également effectuer ces étapes dans MySQL, mais c'est délicat car MySQL comprend que les données se trouvent dans un certain jeu de caractères. Vous devez modifier vos colonnes de texte en un type BLOB, puis les modifier retour aux types de texte avec un jeu de caractères utf8. Voir la section au bas de ALTER TABLE Documentation MySQL intitulée "Avertissement" en rouge .

Après avoir fait l'une de ces choses, les octets stockés dans les colonnes de votre base de données seront le jeu de caractères réel qu'ils prétendent être. Ensuite, assurez-vous de toujours utiliser mysql_set_charset('utf8') sur tout accès à la base de données à partir de PHP que vous pourriez faire à l'avenir ! Sinon, vous gâcherez à nouveau les choses. (Remarque, n'utilisez pas un simple mysql_query('SET NAMES utf8') ! Il existe des cas extrêmes (comme une connexion de réinitialisation) où cela peut être réinitialisé sur latin1 à votre insu. mysql_set_charset() définira le jeu de caractères chaque fois que nécessaire.)

Il serait préférable que vous quittiez mysql_* fonctions et PDO utilisés à la place avec le charset=utf8 paramètre dans votre PDO dsn .