Nettoyer une base données MySQL

renaud63

WRInaute discret
Bonjour à tous,

J'hérite de la gestion d'un site dont la BDD a été mal encodée. Base et tables étaient en utf8_general_ci, et des données 8859-1 ont été importées. Enfin je pense. Toujours est-il que le mot "téléphone" est visible dans PHPmyAdmin comme "téléphone".
Je souhaite donc nettoyer ces données pour les ré-insérer correctement.
Je précise que la base est très chargée en textes.

J'ai tenté :
- Export 8859-1 puis encodage UTF-8 dans Notepad++ : De nombreux caractères échappent à l'encodage ou se transforment en signes chinois. Du coup l'import plante.
- Export UTF-8 et passage par Notepad : mais du coup c'est déjà détecté UTF8 et l'encodage ne fonctionne pas. Essayé ->AINSI puis -> re UTF-8. Pourri.
- Passage par PHP avec utf8_encode et decode, iconv dans les deux sens. Nada.
- Toujours via PHP un str_replace avec 2 arrays, un avec tous les caractères mal encodés, un autre avec leur équivalent "français". C'est le mieux, mais assez aléatoire, sans doute que mes tableaux ne sont pas complets...

Bref, si vous avez déjà été confronté à ce problème, je veux bien quelques tuyaux.
Merci d'avance et bonne journée.
 

salva

WRInaute accro
Pour les tables concernées si tu n'en as pas des wagons.
Code:
update la_table
set le_champ = replace(le_champ, 'cractere_à_virer', 'nouveau_caractere')
Ça fonctionne pas ?
 

renaud63

WRInaute discret
J'ai fait ça, sur le fichier SQL d'export phpMyAdmin (exporté UTF8) mais plein de caractères pourris, à partir d'un file_get_contents et un foreach ligne à ligne :

Code:
function NettoieBase($str=""){
$bad = array('À','Á','Â','Ã','Ä','Ã…','Æ','Ç','È','É','Ê','Ë','ÃŒ','Í','ÃŽ','Ï','Ð','Ñ','Ã’','Ó','Ô','Õ','Ö','Ø','Ù','Ú','Û','Ãœ','Ý','ß','à ','á','â','ã','ä','Ã¥','æ','ç','è','é','ê','ë','ì','í','î','ï','ñ','ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ÿ','Ä€','ā','Ä‚','ă','Ä„','Ä…','Ć','ć','Ĉ','ĉ','ÄŠ','Ä‹','ÄŒ','č','ÄŽ','ď','Đ','Ä‘','Ä’','Ä“','Ä”','Ä•','Ä–','Ä—','Ę','Ä™','Äš','Ä›','Äœ','ĝ','Äž','ÄŸ','Ä ','Ä¡','Ä¢','Ä£','Ĥ','Ä¥','Ħ','ħ','Ĩ','Ä©','Ī','Ä«','Ĭ','Ä­','Ä®','į','Ä°','ı','IJ','ij','Ä´','ĵ','Ķ','Ä·','Ĺ','ĺ','Ä»','ļ','Ľ','ľ','Ä¿','Å€','Ł','Å‚','Ń','Å„','Å…','ņ','Ň','ň','ʼn','ÅŒ','ō','ÅŽ','ŏ','Ő','Å‘','Å’','Å“','Å”','Å•','Å–','Å—','Ř','Å™','Åš','Å›','Åœ','ŝ','Åž','ÅŸ','Å ','Å¡','Å¢','Å£','Ť','Å¥','Ŧ','ŧ','Ũ','Å©','Ū','Å«','Ŭ','Å­','Å®','ů','Å°','ű','Ų','ų','Å´','ŵ','Ŷ','Å·','Ÿ','Ź','ź','Å»','ż','Ž','ž','Å¿','Æ’','Æ ','Æ¡','Ư','Æ°','Ǎ','ÇŽ','Ǐ','ǐ','Ç‘','Ç’','Ç“','Ç”','Ç•','Ç–','Ç—','ǘ','Ç™','Çš','Ç›','Çœ','Ǻ','Ç»','Ǽ','ǽ','Ǿ','Ç¿','n°','Ã','’','º','ÿ','à');
$good =  array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð',
                'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã',
                'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ',
                'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ',
                'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę',
                'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī',
                'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ',
                'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ',
                'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 
                'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 
                'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ',
                'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ','N°','à',"\''",'N°','Ê',' à');

return str_replace($bad, $good, $str);	
}

Ca en nettoie beaucoup, mais pas tout, hélas. Et quand je réimporte, ça plante. Je fais ça sous windows, pas essayé sur le serveur linux. Je n'ai pas trouvé de tableau plus complet des caractères mal encodés. J'ai tenté d'écrire une fonction qui parserait le fichier moisi à la recherche de tous les caractères mal encodés pour générer un tableau $bad...mais galère.
 

Blount

WRInaute impliqué
Regarde du coté de iconv.
C'est pour moi la meilleur fonction pour la conversion d'encodage.

Exemple :
PHP:
<span class="syntaxdefault"><br />setlocale</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">LC_CTYPE</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'fr_FR.UTF-8'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">echo iconv</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'ISO-8859-15'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'UTF-8'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'Chaîne de caractères à convertir.'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span>
 

renaud63

WRInaute discret
Oui, j'ai testé iconv mais cela ne change rien, car je pense que le fichier est en déjà UTF8 (cela est dit dans notepad / encodage). utf8_decode serait ce qui fonctionne le mieux, mais beaucoup de caractères pourris sont omis et plantent à l'import phpMyAdmin. Je cherchais donc quelque chose de plus pointu...
 

Discussions similaires

Haut