Je décline toute responsabilité quant à l'usage fait de ces "codes".
Lisez attentivement cette description avant de faire quoi que ce soit.
Vous penserez bien évidemment, comme avant toute intervention sur une base de données à effectuer au préalable une sauvegarde (données, tables, procédures/triggers) de celle-ci (mysqldump ou éventuellement via phpMyAdmin - déconseillé avec des bases importantes, surtout sur un serveur distant).
S'il est question d'une base de données en production, mettez absolument les applications qui en dépendent hors ligne avant toute chose parce que s'il y a des insertions ou mises à jour dans le même laps de temps, ça risque de poser différents problèmes.
Important : vous ne devez chercher à corriger vos données qu'après avoir définitivement réglé le problème de jeu(x) de caractères qui a lieu essentiellement lors des insertion et mise à jour (il vous manque certainement l'équivalent client d'un SET NAMES
et héritez alors du jeu de caractères par défaut de MySQL qui ne correspond pas à celui utilisé par votre application). Si vous le faites avant, vous allez avoir un mélange de données correctes (celles antérieures à la correction) et des nouvelles qui seront mal encodées, dès lors il sera difficile voire impossible de les reprendre à nouveau. Le but est vraiment de les fixer une fois pour toute, absolument pas de les réparer périodiquement.
Ce gist est composé de 3 "codes" :
- export_import_sql.txt tente de fixer globalement les données d'une base de données en l'exportant (première ligne/commande) puis la réimporant (seconde ligne/commande). Les parties entre crochets (et crochets compris, ils ne sont pas à conserver) sont à remplacer par vos différents identifiants, noms de base de données, etc. A moins d'exporter et réimporter dans des bases de données différentes, il faudra d'abord détruire (DROP) toutes les tables. Si vous rencontrez (ou avez peur de rencontrer) un conflit avec les clés étrangères, désactiver-les avant par
SET FOREIGN_KEY_CHECKS=0;
pour les réactiver aprèsSET FOREIGN_KEY_CHECKS=1;
. - reencode_bad_utf8_in_mysql.php est un script PHP utilisant mysqli qui va effectuer globalement (= sur toute une base) différentes opérations pour tenter de fixer l'encodage des données. Les seuls éléments à modifier sont les identifiants de connexion de la fonction
mysqli_connect
. Il ne doit être exécuté qu'en CLI (ie à partir d'une console/invite de commande), pas depuis un navigateur/via un serveur web, le script étant très lourd, il peut avoir besoin de s'exécuter pendant un long moment or en web, il risque d'être tué en plein milieu avec le risque de rendre vos données incohérentes ! - specific_column.sql est une requête SQL destinée à fixer des données précises = vous devez indiquer le nom de la table, de la colonne et ajouter une clause WHERE si nécessaire et répéter manuellement l'opération pour toute autre colonne concernée. Cette approche, permet d'indiquer une clause WHERE si seulement une partie de la table nécessite une correction (suivant une date d'insertion et/ou mise à jour, un id ou autre).
Seule une de ces trois méthodes doit être employée, choisissez-la avec soins : s'il n'y a qu'une partie des tables qui doit être corrigée, utilisez la dernière (specific_column.sql), pas les deux autres. Avec une correction globale, les données qui sont correctement encodées, ne le seraient plus, donc retour à la case de départ (dans une configuration différente = ces codes ne s'appliquent plus).
Note/rappel : ALTER TABLE implique dans tous les cas un auto-commit