Tabellen und Felder von Binary zu String zurückwandeln.

Johnnii360

Erfahrenes Mitglied
Servus zusammen!

Ich hab da mal eine Frage und brauche Eure Hilfe. Irgenwie blick ich da nicht durch.

Und zwar habe ich gestern meine komplette Tabelle von latin1_swedish_ci in binär mit einem Script umgewandelt, um alles in UTF8-Codierung zu haben.

Hier das Script:

PHP:
$DB_HOST = 'localhost'; // Enter your Database Host
$DB_USER = 'username'; // Enter your Database Username
$DB_PASSWORD = 'password'; // Enter your Database Password
$DB_DATABASE = 'database'; // Enter your Database Name

$tables = array();
$tables_with_fields = array();

$link_id = mysql_connect($DB_HOST, $DB_USER, $DB_PASSWORD) or die('Error establishing a database connection');
echo 'Connected' ."\n";
mysql_select_db($DB_DATABASE, $link_id);
echo 'Selected database' ."\n";

// Gathering information about tables and all the text/string fields that can be affected
// during the conversion to UTF-8.
echo 'Getting tables:' ."\n";
$resource = mysql_query("SHOW TABLES", $link_id);
while ( $result = mysql_fetch_row($resource) ) {
	$tables[] = $result[0];
	echo ' - ' . $result[0] ."\n";
}

if ( !empty($tables) ) {
    echo 'Starting process' ."\n";
    foreach ( (array) $tables as $table ) {
        echo 'Working on table "' . $table . '"';
        $resource = mysql_query("EXPLAIN $table", $link_id);
        while ( $result = mysql_fetch_assoc($resource) ) {
            if ( preg_match('/(char)|(text)|(enum)|(set)/', $result['Type']) )
                $tables_with_fields[$table][$result['Field']] = $result['Type'] . " " . ( "YES" == $result['Null'] ? "" : "NOT " ) . "NULL " .  ( !is_null($result['Default']) ? "DEFAULT '". $result['Default'] ."'" : "" );
                echo '.';
        }
        echo "\n";
    }

    // Change all text/string fields of the tables to their corresponding binary text/string representations.
    echo 'Altering tables to binary character set';
    foreach ( (array) $tables as $table ) {
        mysql_query("ALTER TABLE $table CONVERT TO CHARACTER SET binary", $link_id);
        echo '.';
    }
    echo "\n";

    // Change database and tables to UTF-8 Character set.
    echo 'Altering tables to utf8 character set';
    mysql_query("ALTER DATABASE " . $DB_DATABASE . " CHARACTER SET utf8", $link_id);
    foreach ( (array) $tables as $table ) {
        mysql_query("ALTER TABLE $table CONVERT TO CHARACTER SET utf8", $link_id);
        echo '.';
    }
    echo "\n";

    // Return all binary text/string fields previously changed to their original representations.
    echo 'Altering binary text/string fields to original representation';
    foreach ( (array) $tables_with_fields as $table => $fields ) {
        foreach ( (array) $fields as $field_type => $field_options ) {
            mysql_query("ALTER TABLE $table MODIFY $field_type $field_options", $link_id);
        }
        echo '.';
    }
    echo "\n";

    // Optimize tables and finally close the mysql link.
    echo 'Optimizing tables' . "\n";
    foreach ( (array) $tables as $table )
        mysql_query("OPTIMIZE TABLE $table", $link_id);
    mysql_close($link_id);
    echo 'DONE';
} else {
    die('There are no tables?');
}

Das Script sollte in Binär und dann wieder ins ursprüngliche Format zurückwandeln. Leider gab es aber irgendwie einen Fehler und er hat nicht mehr ins Ursprungformat zurückgewandelt.

Jetzt haben alle Tabellen die Kollation binary, CHAR ist nun BINARY, VARCHAR VARBINARY und TEXT BLOB.

Ich möchte aber alle Tabellen wieder in utf8_unicode_ci und den Datentyp der Felder wie folgt konvertieren:

  • BINARY -> CHAR
  • VARBINARY -> VARCHAR
  • BLOB -> TEXT
  • TINYBLOB -> TINYBLOB

Ich würde mich über eine schnelle Hilfe und ein Script sehr freuen.

Vielen Dank im Voraus!
 
Ja, ein Backup habe ich. Das Problem ist nur, dass in der Zwischenzeit wieder so viele Einträge in manchen Bereichen gemacht wurden. :D So läuft das schon und macht auch keine Probleme, aber wenn man mal so was ändern will, dann ists halt Kacke wenn alles in Binär dort steht.

Die Befehle auf der Seite wandeln dann auch Automatisch die Datentypen der Felder mit um?
 
Also die Tabellen konnte ich gut mit HeidiSQL konvertieren. Die Datentypen der Felder sind aber unverändert geblieben.
 
Zurück