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

unkie
unkie am Dienstag, 29. Mai 2007 um 19:05

netter script :D aber wie wäre es mit ein paar erklärungen, was was macht ;)

Markus René Einicher
Markus René Einicher am Mittwoch, 30. Mai 2007 um 09:48

War nicht als Tutorial gedacht, nur als Codeschnipsel.

unkie
unkie am Donnerstag, 31. Mai 2007 um 19:07

ok, dann ist ja alles geklärt :D

Markus René Einicher
Markus René Einicher am Mittwoch, 5. September 2007 um 17:00

Kack, die Rückstriche wurden aus dem Skript genommen, das nervt mich echt.

Hans am Montag, 5. Januar 2009 um 10:52

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 -.-

Markus René Einicher
Markus René Einicher am Mittwoch, 7. Januar 2009 um 14:06

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