Hol dir Firefox 3 für ein besseres und moderneres Surf-Erlebnis! Dann siehst du uns auch mit runden Ecken ;-)

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!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?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>';
?>
Quelltext: PHP
Erstellt von Markus René Einicher gestern um 14:04:46.
Zuletzt bearbeitet von Markus René Einicher gestern um 14:04:46.
Schlagworte: PHP, MySQL

Kommentare

unkie, am 29.05.2007 um 19:05:16
netter script :D aber wie wäre es mit ein paar erklärungen, was was macht ;)
Markus René Einicher, am 30.05.2007 um 09:48:58
War nicht als Tutorial gedacht, nur als Codeschnipsel.
unkie, am 31.05.2007 um 19:07:54
ok, dann ist ja alles geklärt :D
Markus René Einicher, am 05.09.2007 um 17:00:03
Kack, die Rückstriche wurden aus dem Skript genommen, das nervt mich echt.
Hans, am 05.01.2009 um 10:52:13
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, gestern um 14:06:55
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