Latin1 to UTF8

In Verbindung mit PHP?

Mühsame Sache, da du AFAIK am PHP-Prozess selbst herumwerkeln musst, da du den Charset einer Tabelle auf utf8 ändern kannst aber nicht den Zeichensatz, mit dem die Daten z. B. an PHP gesendet werden sollten.
 
Ich habs selber noch nie gemacht, da ich auch kein Experte für Zeichensätze in MySQL bin, aber es müsste mit Hilfe der Funktion CONVERT() funktionieren.
  • kopiere die Tabellenstruktur und ändere den Zeichensatz für Tabelle und Zeichenfelder, d.h. du hast nun eine neue leere Tabelle
  • INSERT INTO neuetabelle SELECT CONVERT(feld1, latin1=>UTF-8 irgendwie) AS feld1, CONVERT(feld2, ...) ... FROM altetabelle
Probier mal, ob das hilft.
 
Ich hatte da mal eine nützliche Variante gefunden, weiß aber nicht mehr woher.

PHP:
<?php

$dbname = 'database';
mysql_connect('localhost', 'username', 'password');
mysql_query("ALTER DATABASE `$dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
$res = mysql_query("SHOW TABLES FROM `$dbname`");
while($row = mysql_fetch_row($res)) {
   $query = "ALTER TABLE {$dbname}.`{$row[0]}` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
   mysql_query($query);
   $query = "ALTER TABLE {$dbname}.`{$row[0]}` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
   mysql_query($query);
}
echo 'Alle Tabellen konvertiert.';

?>

Dann solltest du halt noch darauf achten, dass auch sämtliche Dateien als UTF-8 ohne BOM abgespeichert sind sowie möglicherweise auch die Datenbankverbindung mit UTF-8 aufgebaut wird, da es da auch ab und zu Probleme gibt, obwohl alles auf UTF-8 gestellt ist.
 
Für die reine Konvertierung der Datenbank sollte tatsächlich so ein Script genügen wie Zman gepostet hat. Findet sich in dutzenden verschiedenen Versionen im Internet, einfach mal googeln und nachschauen welches am besten geeignet ist.
Bevor du irgendetwas in einem Produktivsystem tust, probier das ganze aber erstmal irgendwo aus. Die Dokumentation und einige über Google leicht auffindbare Texte verraten da schnell, wo Probleme liegen können. Insbesondere könnte es problematisch werden, wenn du nicht Client und Server der Datenbankverbindung selbst konfigurieren kannst (siehe Doku "What character set is the statement in when it leaves the client? / What character set should the server translate a statement to after receiving it? / What character set should the server translate to before shipping result sets or error messages back to the client?" etc.).

Wenn man nicht viel Einfluss auf die Konfiguration hat, fährt man meinen bisherigen Erfahrungen nach besser damit, wenn man die Datenbank bei latin1 belässt. Das hindert einen ja nicht daran, dennoch Einträge in UTF8 zu speichern und zu verarbeiten, es sei denn natürlich, wenn man in der Datenbank selbst mit multibyte-Funktionen arbeiten will, während die Datenbank denkt, sie hätte nur ein Byte pro Zeichen.