PHP Skript zur Konvertierung einer MySQL Datenbank in UTF-8
Dieses Skript konvertiert mittels PHP eine ausgewählte MySQL-Datenbank in UTF-8. Sowohl der Zeichensatz der Datenbank, als auch der Tabellen, jeder einzelnen Spalte und der gesamte Datenbestand werden in UTF-8 umgeschrieben. Ich verwende dazu die PHP-MultiByteConvertString-Funktion, die es einem ermöglich zwischen einzelnen Zeichensätzen hin und her zu konvertieren. Unglaublich was so ein kleines Skript bereits bewirken kann.
Bei großen Datenbeständen ist dies mit bedacht einzusetzen, da es einen enormen Kraftakt für den Server und die Datenbank darstellt!
<?php header('Content-Type: text/html; charset=UTF-8'); if (!function_exists('mb_convert_encoding')) { exit('Die Multibyte String Funktionalität ist nicht verfügabr. Siehe http://www.php.net/mbstring.'); } exit('Vorsicht, dieses Skript durchkämmt die gesamte ausgewählte Datenbank und kovertiert sowohl die Tabellen, als auch die Spalten und den gesamten Dateninhalt in UTF-8! Dies ist eine Sicherung in Zeile 8. Sie muss auskommentiert werden, damit das Skript läuft und sollte gleich nach dem Gebrauch wieder aktiviert werden, da dies eine ENORME Datenbanklast erzeugt.'); mysql_connect('localhost', 'user', 'password'); mysql_select_db('database'); $qryTables = mysql_query('SHOW TABLES'); echo '<pre>'; while ($tables = mysql_fetch_array($qryTables)) { $qryCols = mysql_query('SHOW COLUMNS FROM `'.$tables[0].'`'); $sqlVals = ''; $postSql = ''; while ($cols = mysql_fetch_object($qryCols)) { mysql_query('ALTER TABLE `'.$tables[0].'` CHANGE `'.$cols->Field.'` `'.$cols->Field.'` '.$cols->Type.' CHARACTER SET utf8'); print_r('ALTER TABLE `'.$tables[0].'` CHANGE `'.$cols->Field.'` `'.$cols->Field.'` '.$cols->Type.' CHARACTER SET utf8'.chr(10)); $sqlVals .= $cols->Field.' = \\\'\'.mysql_escape_string(mb_convert_encoding($data->'.$cols->Field.', \'UTF-8\')).\'\\\', '; $postSql .= ' AND `'.$cols->Field.'` = \\\'\'.mysql_escape_string(mb_convert_encoding($data->'.$cols->Field.', \'UTF-8\')).\'\\\''; } $sqlVals = substr($sqlVals, 0, strlen($sqlVals)-2); $qryData = mysql_query('SELECT * FROM `'.$tables[0].'`'); while ($data = mysql_fetch_object($qryData)) { eval('$sql = \''.$postSql.'\';'); eval('$val = \''.$sqlVals.'\';'); echo 'UPDATE `'.$tables[0].'` SET '.$val.' WHERE 0=0'.$sql.chr(10); } mysql_query('ALTER TABLE `'.$tables[0].'` DEFAULT CHARACTER SET utf8'); print_r('ALTER TABLE `'.$tables[0].'` DEFAULT CHARACTER SET utf8'.chr(10).chr(10)); } echo '</pre>'; ?>

Kommentare
netter script :D aber wie wäre es mit ein paar erklärungen, was was macht ;)
War nicht als Tutorial gedacht, nur als Codeschnipsel.
ok, dann ist ja alles geklärt :D
Kack, die Rückstriche wurden aus dem Skript genommen, das nervt mich echt.
Die Idee ist super, leider funktioniert es aus einem dubiosen Grund nicht...
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /www/htdocs/w007e37a/tools/convert.php on line 21
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /www/htdocs/blabla/tools/convert.php on line 30
ALTER TABLE `` DEFAULT CHARACTER SET utf8
Mal debuggen -.-
Hab das Skript ein wenig verändert, jetzt sollte es gehen (vorher unbedingt einen Dump machen)
* Rückstriche funzen jetzt richtig
* mysql_fetch_array ermöglicht die richtigen Tabellen auszuwählen vorher war das Tables_in_alg noch direkt daraus wie ich das gebraucht hab und mit mysql_fetch_object