UTF-8

Ich habe heute den ganzen Tag versucht diesen Blog in UTF-8 zu konvertieren. Wenn also zwischendurch etwas zerschossen war, oder der Server etwas gelahmt hat, dann lag es wahrscheinlich daran.

Das Problem war, wie kriegt man die Daten in der Datenbank nach UTF-8 konvertiert. Meine Versuche das direkt über MySQL zu machen, sind leider alle komplett gescheitert. Ich habe mich daher dazu entschlossen, die Daten mit einem kleinen PHP-Script auf der Konsole zu konvertieren.

Raus gekommen ist dabei folgendes Script. Das Script ließt alle Tabellen aus einer Datenbank und ließt diese dann komplett aus, kovertiert sie und speichert sie in einer neuen Datenbank. Dabei erwartet das Script bereits alle Tabellen in der neuen Datenbank. Auch nimmt das Script keine Rücksicht auf die Daten. Schauen wir also mal, ob das Blog funktioniert, und wie lange...

convert.php:
<?php

// Einstellungen
$db_name     = 'localhost';
$db_login    = 'ridcully';
$db_password = '';
$db_source = 'ridcully';
$db_target = 'ridcully_new';

// DB verbinden
$db = mysql_connect($db_name, $db_login, $db_password);

// Tabellen von Source laden
$res = mysql_query('SHOW TABLES FROM ' . $db_source);
$tables = array();
while ($ret = mysql_fetch_array($res)) $tables [] = $ret[0];

// Tabellen aus Source lesen, in UTF8 umwandeln und in Target speichern
foreach($tables as $table) {
	echo "Tabelle: $table\n";
	$res = mysql_query($q = 'SELECT * FROM ' . $db_source . '.' . $table, $db);
	while ($ret = mysql_fetch_array($res)) {
		$q = 'INSERT INTO ' . $db_target . '.' . $table . ' VALUES (';
		foreach ($ret as $key => $value) {
			if (is_numeric($key))
				continue;
			$q .= '\'' . mysql_escape_string(utf8_encode($value)) . '\', ';
			}
		$q = substr($q, 0, strlen($q) - 2) . ');';
		mysql_query($q);
	}
}

?>
Das Script kommt ohne Garantie und ohne wirklich getestet zu sein. Entweder es funktioniert, oder man verliert seine Daten. Einsatz also auf eigene Gefahr!

Trackbacks

    Keine Trackbacks

Kommentare

Ansicht der Kommentare: (Linear | Verschachtelt)

  1. Ich schreibt:

    *warum ziehst nicht einfach 'n dump und importierst diesen nach umstellung des db charsets auf utf8 wieder aber unter angabe, dass das file latin1 ist... so einfach geht das...

  2. ridcully schreibt:

    *Genau, auf die Idee bin ich auch gekommen. Hat nur nicht funktioniert. Und ich habe es ein halbes dutzend mal probiert. Immer ein klein wenig anders... Mochte er nur nicht...

  3. Stephen schreibt:

    *... und den Dump einfach nach UTF-8 konvertieren hätte es nicht gebracht?

  4. ridcully schreibt:

    *Der Dump war/ist 280 MB groß. Lokal hätte ich den konvertieren können. Der Upload dauert dann auch nur knappe 24h...

    Auf dem Server? K.a. gibt es ein automatisches Tool? nano und vi hatten beim öffnen schon Probleme. Die musste ich killen, damit der Server nicht total in die Knie geht! Für sed hätte ich die UTF-8 Zeichen und die iso-Zeichen wissen müssen. Weiß ich aber nicht...

  5. Stephen schreibt:

    *... klingt wie Baum fällen mit nem Leopard II.

    Hattest Du nicht zwischenzeitlich mal das Gefühl, dass das einfacher gehen könnte?

  6. ridcully schreibt:

    *Ja, hatte ich! Nur nachdem ich einen halben Tag an der einfachen Lösung gesessen habe, hab ich dann doch das Script genommen...

  7. Kai schreibt:

    *Mit 'iconv' haettest du es noch probieren koennen. *klugscheiß* :-)

  8. ridcully schreibt:

    *Das sagst du mir jetzt? Im wesentlichen ist iconv das, was ich gesucht hätte... Ist mir aber nicht eingefallen. Und ob es geklappt hätte... wer weiß! ;)


Kommentar schreiben


Gravatar/Favatar Autoren Bilder werden unterstützt.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss um dieses Verfahren anzuwenden.
CAPTCHA