2010-07-04 24 views
5

J'ai une application web PHP avec des tables MySQL prenant du texte utf8. J'ai récemment converti les données de latin1 en utf8 ainsi que les tables et les colonnes en conséquence. J'ai, cependant, oublié d'utiliser mysql_set_charset et les dernières données entrantes que je supposerais provenir de la connexion MySQL comme latin1. Je ne sais pas ce qui se passe quand latin1 arrive dans une colonne utf8, mais cela provoque des problèmes d'affichage étranges pour des éléments comme la virgule, les guillemets, l'esperluette, etc.insertion de texte codé latin1 dans les tables utf8 (j'ai oublié d'utiliser mysql_set_charset)

Maintenant que mysql_set_charset est en place, il tire les données avec des personnages funky. Un moyen de convertir la soupe latin1-utf8 en utf8 droite maintenant que j'ai la ressource de connexion de base de données en utilisant le jeu de caractères correct?

+0

Trop paresseux pour tester et vendre comme ma réponse .. http://www.mysqlperformanceblog.com/2007/12/18/fixing-column-encoding-mess-in-mysql/ devrait vous aider (certains bons commentaires là aussi). S'il est possible d'obtenir simplement les lignes insérées/mises à jour pendant la période où set_charset() était manquant, vous pouvez même convertir ces lignes pratiquement sans rien vérifier. – Kuchen

Répondre

4

trouvé le correctif avec votre commentaire. Voici la ligne SQL qui a apparemment résolu mon problème.

UPDATE table SET col = CONVERT(CONVERT(CONVERT(col USING latin1) USING binary) using utf8); 

Même si la colonne est UTF8, il l'oblige à tirer les données comme latin1, convertir en binaire, convertir en UTF8 et ré-insérer.

+0

copier la table avant d'utiliser, hwo know –