[MySQL] Datenbankumstellung von ISO-8859-1 auf UTF-8

aGeNET

Erfahrenes Mitglied
Hallo,

die Datenbank eines Shopsystems und auch das System selbst sollen von ISO-8859-1 (latin1) auf UTF-8 umgestellt werden.

Wie das Ganze in den PHP- und HTML-Dateien zu realisieren ist, weiß ich und das stellt auch kein Problem dar.

Nun stellt sich mir allerdings die Frage, was bei der Umstellung der MySQL-Datenbank alles zu beachten ist. Das Charset soll von latin1_swedish_ci in utf8_general_ci geändert werden.

Reicht es, nur global das Charset der Datenbank zu ändern:
Code:
ALTER DATABASE db_name CHARACTER SET utf8 COLLATE utf8_general_ci;

oder muss in jeder Tabelle jedes einzelne Datenfeld umgewandelt werden? Die nächste Frage wäre, ob die Inhalte der Datenfelder bei der Umstellung automatisch konvertiert werden oder ob das auch "von Hand" gemacht werden muss.

Der komplette Umstellungsprozess muss skriptbasiert (PHP) möglich sein, da diese Änderung per Updateautomatik in mehreren Systemen vorgenommen werden soll.

mfg aGeNET
 
Zuletzt bearbeitet:
Nach tagelanger Suche im Netz bin ich auf eine Lösung gestoßen. Falls es irgendwann mal jemand braucht:
PHP:
<?php
//MySQL connection settings
$db_host = "localhost";
$db_user = "user";
$db_pass = "pass";
$db_name = "name";

mysql_connect($db_host, $db_user, $db_pass) or die(mysql_errno().": ".mysql_error());

//Put here a list of databases you need to change charset at or leave array empty to change all existing
$db_list = array($db_name);

//If changing at all databases, which databases to skip? information_schema is mysql system database and no need to change charset on it.
$skip_db_list = array('confixx', 'information_schema', 'mysql', 'test');

//Which charset to convert to?
$charset = "utf8";

//Which collation to convert to?
$collation = "utf8_general_ci";

//Only print queries without execution?
$printonly = true;

//Getting database names if they are not specified
if (sizeof($db_list) < 1) {
    $skip_db_text = '"'.implode('", "', $skip_db_list).'"';
    $dbs_query = "SELECT GROUP_CONCAT(`SCHEMA_NAME` SEPARATOR ',') AS convertable FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` NOT IN ($skip_db_text);";
    $dbs_result = mysql_query($dbs_query) or die(mysql_errno().": ".mysql_error());
    $data = mysql_fetch_assoc($dbs_result);
    $db_list = explode(",", $data['convertable']);
}

//Iterating databases
ob_start();
foreach ($db_list as $db_name) {
    $table_query = "SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET $charset COLLATE $collation;') AS convertable FROM `information_schema`.`TABLES` t WHERE t.`TABLE_SCHEMA` = '$db_name' ORDER BY 1;";
    $table_result = mysql_query($table_query) or die(mysql_errno().": ".mysql_error());
    if (mysql_num_rows($table_result) > 0) {
        $db_query = "ALTER DATABASE `$db_name` CHARACTER SET $charset COLLATE $collation;";
        echo $db_query."\r\n";
        if ($printonly === false) {
            mysql_query($db_query) or die(mysql_errno().": ".mysql_error());
		}
	    while ($row = mysql_fetch_assoc($table_result)) {
	        echo $row['convertable']."\r\n";
	        if ($printonly === false) {
	            mysql_query($row['convertable']) or die(mysql_errno().": ".mysql_error());
	        }
	    }
	}
}
$sql = ob_get_contents();
ob_end_clean();
if ($printonly === true) {
	$fp = fopen(dirname(__FILE__)."/db_convert_to_$charset.sql", "a");
	fwrite($fp, $sql);
	fclose($fp);
}
?>
 

Neue Beiträge

Zurück