PHP > MySQL Datenbank in UTF-8 konvertieren

Folgendes PHP-Skript konvertiert eine komplette MySQL Datenbank in UTF-8:

define('DB_HOST', 'localhost');
define('DB_NAME', 'datenbank_name');
define('DB_USER', 'benutzer');
define('DB_PASSWD', 'supergeheimespasswort');
 
mysql_connect(DB_HOST, DB_USER, DB_PASSWD);
mysql_select_db(DB_NAME);
 
$result = mysql_query("SHOW TABLES");
while($row = mysql_fetch_assoc($result))
{
	$tableName = $row['Tables_in_'.DB_NAME];
	$fields = array();
	$primaryKey = null;
	mysql_query("ALTER TABLE `{$tableName}` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
	$_result = mysql_query("DESCRIBE `{$tableName}`");
	while($_row = mysql_fetch_assoc($_result))
	{
		if(isset($_row['Key']) && $_row['Key'] == 'PRI' && !$primaryKey)
		{
			$primaryKey = $_row['Field'];
		}
		if(strpos($_row['Type'], 'varchar') !== false || strpos($_row['Type'], 'text') !== false)
		{
			$fields[] = $_row['Field'];
			mysql_query("ALTER TABLE `{$tableName}` CHANGE `{$_row['Field']}` `{$_row['Field']}` {$_row['Type']} CHARACTER SET utf8 COLLATE utf8_general_ci");
		}
	}
	if(!empty($fields) && !empty($primaryKey))
	{
		$fields[] = $primaryKey;
		$_result = mysql_query("SELECT `".implode('`,`', $fields)."` FROM `{$tableName}`");
		while($_row = mysql_fetch_assoc($_result))
		{
			$values = array();
			foreach($_row as $field => &$value)
			{
				if($field != $primaryKey && !empty($value))
				{
					$values[] = "`".$field."` = '".utf8_encode($value)."'";
				}
			}
			$sql = "UPDATE `{$tableName}` SET ".implode(',', $values)." WHERE `{$primaryKey}` = '{$_row[$primaryKey]}'";
			mysql_query($sql);
		}
	}
}

Es werden nicht nur die Tabellen selbst, sondern auch alle geeigneten Felder konvertiert.

UPDATE 31.03.2011:
Ich habe das Skript noch einmal erweitert, sodass nicht nur die Datenbank konvertiert wird, sondern auch die Inhalte alle Datensätze.

5 Kommentare zu “PHP > MySQL Datenbank in UTF-8 konvertieren

  1. GENIAL! Habe schon ein andres Script gefunden, welches mir aber die Inhalte vor Umlaut weggeschnitten hat, aber deins hier funktioniert perfekt!

    Dank dir 😉

  2. Hey, danke für das Script – Funktioniert super! Nur leider gibt’s eine Zeitüberschreitung wegen PHP, max. 30 Sekunden 😛
    Wie kann ich das umgehen?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.