Codeschnipsel: MySQL-Datenbanken in UTF8 konvertieren

mysql

Beim Update von älteren Systemen stößt man hin und wieder auf die Problematik, dass Zeichensätze wie der gute alte ISO 8859-1 (Latin-1, Westeuropäisch) in den neueren, state of the art Zeichensatz UTF-8 (Universal Character Set) konvertiert werden sollen. Natürlich könnte man nun Tabelle für Tabelle einzeln mit phpMyAdmin oder ähnlichen Tools umwandeln, bei großen Content Management Systemen oder Online Shops, können das aber sehr viele Tabellen sein. Falls man diese Operation nun auch noch bei mehreren Systemen durchführen muss, kann das ganz schön zeitaufwendig werden. Da bietet es sich an, ein Skript einzusetzen, das einem die Arbeit abnimmt und die Konvertierung automatisch ausführt.

Hier ist so ein Skript. Einfach die Datenbank-Verbindung anpassen, auf den Server hochladen und im Browser aufrufen! Viel Vergnügen!

< ?php

// UTF8 Konverter

// MySQL Verbindung
$db_server = 'localhost';
$db_user = "root";
$db_password = "root";

mysql_connect($db_server, $db_user, $db_password) or die(mysql_error());

// Liste von Datenbanken, bei denen der Zeichensatz geändert werden soll.
// Wenn das Array leer ist, werden alle Datenbanken konvertiert!
$dblist = array('meinedatenbank');

// Datenbanken, die nicht konvertiert werden sollen.
// information_schema und mysql sind System-Datenbanken und sollen nicht konvertiert werden.
$skip_db_list = array('information_schema', 'mysql');

// In diesen Zeichensatz konvertieren:
$charset = "utf8";

// In diese collation konvertieren:
$collation = "utf8_unicode_ci";

// Für Testzwecke: Wenn true, SQL-Abfrage nur ausgeben, nicht ausführen.
$printonly = false;

// Alle Datenbanknamen heraussuchen, falls sie nicht explizit angegeben wurden.
$skip_db_text = '"'.implode('", "', $skip_db_list).'"';
if(count($dblist)&amp;amp;amp;amp;amp;lt;1) {
$sql="SELECT GROUP_CONCAT(`SCHEMA_NAME` SEPARATOR ',') AS FRST FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` NOT IN ($skip_db_text)";
$result = mysql_query($sql) or die(mysql_error());
$data = mysql_fetch_assoc ($result);
$dblist=explode(",", $data["FRST"]);
}

// Durch die Datenbanken iterieren
foreach ($dblist as $dbname) {
// SQL-Statement für die Konvertierung
$sql="SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET $charset COLLATE $collation;') as FRST FROM `information_schema`.`TABLES` t WHERE t.`TABLE_SCHEMA` = '$dbname' ORDER BY 1";

$result = mysql_query($sql) or die(mysql_error());
// Durch die Zeilen der Tabelle gehen
while ($row = mysql_fetch_assoc($result)) {

if(true != $printonly) {
mysql_query($row["FRST"]) or die(mysql_error());
echo $row["FRST"]."\r\n";
} else {
echo $row["FRST"]."\r\n";
}
}
}
?>