web-dev-qa-db-de.com

Ein Skript zum Ändern aller Tabellen und Felder in die utf-8-bin-Sortierung in MySQL

Gibt es ein SQL- oder PHP-Skript, das ich ausführen kann, das die Standardkollatierung in allen Tabellen und Feldern einer Datenbank ändert?

Ich kann selbst eine schreiben, aber ich denke, dass dies etwas ist, das auf einer solchen Site leicht verfügbar ist. Wenn ich mir selbst eins einfallen lassen kann, bevor jemand eins veröffentlicht, werde ich es selbst posten.

55
nlaq

Achtung! Wenn Sie utf tatsächlich als eine andere Kodierung gespeichert haben, könnten Sie ein echtes Chaos in Ihren Händen haben. Zuerst sichern. Dann probieren Sie einige der Standardmethoden:

beispielsweise http://www.cesspit.net/drupal/node/898http://www.hackszine.com/blog/archive/2007/05/mysql_database_migration_latin.html

Ich musste alle Textfelder in binär konvertieren und dann wieder in varchar/text konvertieren. Das hat mir den Arsch gerettet. 

Ich hatte Daten UTF8, gespeichert als latin1. Was ich getan habe:

Drop-Indizes . Konvertieren von Feldern in Binär . Konvertieren in utf8-general ci

Wenn Sie sich auf LAMP befinden, vergessen Sie nicht, den Befehl set NAMES hinzuzufügen, bevor Sie mit der Datenbank interagieren, und stellen Sie sicher, dass Sie die Kopfzeilen für die Zeichencodierung festlegen. 

24
Buzz

Kann in einem einzigen Befehl ausgeführt werden (anstelle von PHP 148):

mysql --database=dbname -B -N -e "SHOW TABLES" \
| awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' \
| mysql --database=dbname &

Sie müssen die Kommandozeile lieben ... (Sie müssen möglicherweise die Optionen --user und --password für mysql verwenden).

BEARBEITEN: Um Fremdschlüsselprobleme zu vermeiden, wurden SET foreign_key_checks = 0; und SET foreign_key_checks = 1; hinzugefügt.

85

Ich denke, es ist einfach, dies in zwei Schritten zu tun, indem Sie PhpMyAdmin ausführen.
Schritt 1:  

SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`,
 '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as stmt 
FROM `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` = 'database_name'
ORDER BY 1

Schritt 2:
Diese Abfrage gibt eine Liste von Abfragen aus, eine für jede Tabelle. Sie müssen die Liste der Abfragen kopieren und in die Befehlszeile oder in die Registerkarte "SQL" von PhpMyAdmin einfügen, um die Änderungen vorzunehmen.

39
Ivan

OK, ich habe dies unter Berücksichtigung dessen geschrieben, was in diesem Thread gesagt wurde. Danke für die Hilfe, und ich hoffe, dass dieses Skript anderen helfen wird. Ich habe keine Garantie für die Verwendung, also BITTE BACKUP, bevor Sie es ausführen. Es sollte arbeitet mit allen Datenbanken; und es hat super funktioniert.

BEARBEITEN: Am oberen Rand wurden vars hinzugefügt, für die der Zeichensatz/die Sortierung in ..__ konvertiert werden soll

<?php

function MysqlError()
{
    if (mysql_errno())
    {
        echo "<b>Mysql Error: " . mysql_error() . "</b>\n";
    }
}

$username = "root";
$password = "";
$db = "database";
$Host = "localhost";

$target_charset = "utf8";
$target_collate = "utf8_general_ci";

echo "<pre>";

$conn = mysql_connect($Host, $username, $password);
mysql_select_db($db, $conn);

$tabs = array();
$res = mysql_query("SHOW TABLES");
MysqlError();
while (($row = mysql_fetch_row($res)) != null)
{
    $tabs[] = $row[0];
}

// now, fix tables
foreach ($tabs as $tab)
{
    $res = mysql_query("show index from {$tab}");
    MysqlError();
    $indicies = array();

    while (($row = mysql_fetch_array($res)) != null)
    {
        if ($row[2] != "PRIMARY")
        {
            $indicies[] = array("name" => $row[2], "unique" => !($row[1] == "1"), "col" => $row[4]);
            mysql_query("ALTER TABLE {$tab} DROP INDEX {$row[2]}");
            MysqlError();
            echo "Dropped index {$row[2]}. Unique: {$row[1]}\n";
        }
    }

    $res = mysql_query("DESCRIBE {$tab}");
    MysqlError();
    while (($row = mysql_fetch_array($res)) != null)
    {
        $name = $row[0];
        $type = $row[1];
        $set = false;
        if (preg_match("/^varchar\((\d+)\)$/i", $type, $mat))
        {
            $size = $mat[1];
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} VARBINARY({$size})");
            MysqlError();
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} VARCHAR({$size}) CHARACTER SET {$target_charset}");
            MysqlError();
            $set = true;

            echo "Altered field {$name} on {$tab} from type {$type}\n";
        }
        else if (!strcasecmp($type, "CHAR"))
        {
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} BINARY(1)");
            MysqlError();
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} VARCHAR(1) CHARACTER SET {$target_charset}");
            MysqlError();
            $set = true;

            echo "Altered field {$name} on {$tab} from type {$type}\n";
        }
        else if (!strcasecmp($type, "TINYTEXT"))
        {
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} TINYBLOB");
            MysqlError();
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} TINYTEXT CHARACTER SET {$target_charset}");
            MysqlError();
            $set = true;

            echo "Altered field {$name} on {$tab} from type {$type}\n";
        }
        else if (!strcasecmp($type, "MEDIUMTEXT"))
        {
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} MEDIUMBLOB");
            MysqlError();
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} MEDIUMTEXT CHARACTER SET {$target_charset}");
            MysqlError();
            $set = true;

            echo "Altered field {$name} on {$tab} from type {$type}\n";
        }
        else if (!strcasecmp($type, "LONGTEXT"))
        {
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} LONGBLOB");
            MysqlError();
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} LONGTEXT CHARACTER SET {$target_charset}");
            MysqlError();
            $set = true;

            echo "Altered field {$name} on {$tab} from type {$type}\n";
        }
        else if (!strcasecmp($type, "TEXT"))
        {
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} BLOB");
            MysqlError();
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} TEXT CHARACTER SET {$target_charset}");
            MysqlError();
            $set = true;

            echo "Altered field {$name} on {$tab} from type {$type}\n";
        }

        if ($set)
            mysql_query("ALTER TABLE {$tab} MODIFY {$name} COLLATE {$target_collate}");
    }

    // re-build indicies..
    foreach ($indicies as $index)
    {
        if ($index["unique"])
        {
            mysql_query("CREATE UNIQUE INDEX {$index["name"]} ON {$tab} ({$index["col"]})");
            MysqlError();
        }
        else
        {
            mysql_query("CREATE INDEX {$index["name"]} ON {$tab} ({$index["col"]})");
            MysqlError();
        }

        echo "Created index {$index["name"]} on {$tab}. Unique: {$index["unique"]}\n";
    }

    // set default collate
    mysql_query("ALTER TABLE {$tab}  DEFAULT CHARACTER SET {$target_charset} COLLATE {$target_collate}");
}

// set database charset
mysql_query("ALTER DATABASE {$db} DEFAULT CHARACTER SET {$target_charset} COLLATE {$target_collate}");

mysql_close($conn);
echo "</pre>";

?>
27
nlaq

Dieses PHP -Schnipsel ändert die Kollatierung für alle Tabellen in einer Datenbank. (Es wurde von dieser Seite entnommen.)

<?php
// your connection
mysql_connect("localhost","root","***");
mysql_select_db("db1");

// convert code
$res = mysql_query("SHOW TABLES");
while ($row = mysql_fetch_array($res))
{
    foreach ($row as $key => $table)
    {
        mysql_query("ALTER TABLE " . $table . " CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci");
        echo $key . " =&gt; " . $table . " CONVERTED<br />";
    }
}
?> 
14
Rich Adams

Ein anderer Ansatz, der eine Befehlszeile verwendet, basiert auf @ david ohne die awk

for t in $(mysql --user=root --password=admin  --database=DBNAME -e "show tables";);do echo "Altering" $t;mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;";done

veredelt

  for t in $(mysql --user=root --password=admin  --database=DBNAME -e "show tables";);
    do 
       echo "Altering" $t;
       mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;";
    done
4
RameshVel

Eine vollständigere Version des obigen Skripts finden Sie hier:

http://www.zen-cart.com/index.php?main_page=product_contrib_info&products_id=1937

Bitte hinterlassen Sie hier ein Feedback zu diesem Beitrag: http://www.zen-cart.com/forum/showthread.php?p=1034214

3
Dustin

In Skripts über allen Tabellen, die zur Konvertierung ausgewählt wurden (mit SHOW TABLES), ist dies jedoch eine bequemere und tragbarere Möglichkeit, die Tabellensammlung vor dem Konvertieren einer Tabelle zu überprüfen. Diese Abfrage macht es:

SELECT table_name
     , table_collation 
FROM information_schema.tables
1

Zeichensatz und Sortierfolge sind nicht dasselbe. Eine Kollatierung enthält Regeln zum Sortieren von Zeichenfolgen. Ein Zeichensatz enthält Regeln zur Darstellung von Zeichen. Eine Kollatierung hängt vom Zeichensatz ab.

1
troelskn

Verwenden Sie meine benutzerdefinierte Shell collatedb , es sollte funktionieren: 

collatedb <username> <password> <database> <collation>

Beispiel:

collatedb root 0000 myDatabase utf8_bin
0
Abdennour TOUMI

Ich habe die Antwort von nlaq aktualisiert, um mit PHP7 zu arbeiten und mehrspaltige Indizes, binär sortierte Daten (z. B. latin1_bin) usw. korrekt zu verarbeiten, und den Code ein wenig bereinigt. Dies ist der einzige Code, den ich gefunden/versucht habe, der meine Datenbank erfolgreich von latin1 nach utf8 migriert hat.

<?php

/////////// BEGIN CONFIG ////////////////////

$username = "";
$password = "";
$db = "";
$Host = "";

$target_charset = "utf8";
$target_collation = "utf8_unicode_ci";
$target_bin_collation = "utf8_bin";

///////////  END CONFIG  ////////////////////

function MySQLSafeQuery($conn, $query) {
    $res = mysqli_query($conn, $query);
    if (mysqli_errno($conn)) {
        echo "<b>Mysql Error: " . mysqli_error($conn) . "</b>\n";
        echo "<span>This query caused the above error: <i>" . $query . "</i></span>\n";
    }
    return $res;
}

function binary_typename($type) {
    $mysql_type_to_binary_type_map = array(
        "VARCHAR" => "VARBINARY",
        "CHAR" => "BINARY(1)",
        "TINYTEXT" => "TINYBLOB",
        "MEDIUMTEXT" => "MEDIUMBLOB",
        "LONGTEXT" => "LONGBLOB",
        "TEXT" => "BLOB"
    );

    $typename = "";
    if (preg_match("/^varchar\((\d+)\)$/i", $type, $mat))
        $typename = $mysql_type_to_binary_type_map["VARCHAR"] . "(" . (2*$mat[1]) . ")";
    else if (!strcasecmp($type, "CHAR"))
        $typename = $mysql_type_to_binary_type_map["CHAR"] . "(1)";
    else if (array_key_exists(strtoupper($type), $mysql_type_to_binary_type_map))
        $typename = $mysql_type_to_binary_type_map[strtoupper($type)];
    return $typename;
}

echo "<pre>";

// Connect to database
$conn = mysqli_connect($Host, $username, $password);
mysqli_select_db($conn, $db);

// Get list of tables
$tabs = array();
$query = "SHOW TABLES";
$res = MySQLSafeQuery($conn, $query);
while (($row = mysqli_fetch_row($res)) != null)
    $tabs[] = $row[0];

// Now fix tables
foreach ($tabs as $tab) {
    $res = MySQLSafeQuery($conn, "SHOW INDEX FROM `{$tab}`");
    $indicies = array();

    while (($row = mysqli_fetch_array($res)) != null) {
        if ($row[2] != "PRIMARY") {
            $append = true;
            foreach ($indicies as $index) {
                if ($index["name"] == $row[2]) {
                    $index["col"][] = $row[4];
                    $append = false;
                }
            }
            if($append)
                $indicies[] = array("name" => $row[2], "unique" => !($row[1] == "1"), "col" => array($row[4]));
        }
    }

    foreach ($indicies as $index) {
        MySQLSafeQuery($conn, "ALTER TABLE `{$tab}` DROP INDEX `{$index["name"]}`");
        echo "Dropped index {$index["name"]}. Unique: {$index["unique"]}\n";
    }

    $res = MySQLSafeQuery($conn, "SHOW FULL COLUMNS FROM `{$tab}`");
    while (($row = mysqli_fetch_array($res)) != null) {
        $name = $row[0];
        $type = $row[1];
        $current_collation = $row[2];
        $target_collation_bak = $target_collation;
        if(!strcasecmp($current_collation, "latin1_bin"))
            $target_collation = $target_bin_collation;
        $set = false;
        $binary_typename = binary_typename($type);
        if ($binary_typename != "") {
            MySQLSafeQuery($conn, "ALTER TABLE `{$tab}` MODIFY `{$name}` {$binary_typename}");
            MySQLSafeQuery($conn, "ALTER TABLE `{$tab}` MODIFY `{$name}` {$type} CHARACTER SET '{$target_charset}' COLLATE '{$target_collation}'");
            $set = true;
            echo "Altered field {$name} on {$tab} from type {$type}\n";
        }
        $target_collation = $target_collation_bak;
    }

    // Rebuild indicies
    foreach ($indicies as $index) {
         // Handle multi-column indices
         $joined_col_str = "";
         foreach ($index["col"] as $col)
             $joined_col_str = $joined_col_str . ", `" . $col . "`";
         $joined_col_str = substr($joined_col_str, 2);

         $query = "";
         if ($index["unique"])
             $query = "CREATE UNIQUE INDEX `{$index["name"]}` ON `{$tab}` ({$joined_col_str})";
         else
             $query = "CREATE INDEX `{$index["name"]}` ON `{$tab}` ({$joined_col_str})";
         MySQLSafeQuery($conn, $query);

        echo "Created index {$index["name"]} on {$tab}. Unique: {$index["unique"]}\n";
    }

    // Set default character set and collation for table
    MySQLSafeQuery($conn, "ALTER TABLE `{$tab}`  DEFAULT CHARACTER SET '{$target_charset}' COLLATE '{$target_collation}'");
}

// Set default character set and collation for database
MySQLSafeQuery($conn, "ALTER DATABASE `{$db}` DEFAULT CHARACTER SET '{$target_charset}' COLLATE '{$target_collation}'");

mysqli_close($conn);
echo "</pre>";

?>
0
davewy

Für Windows Benutzer

Zusätzlich zur @davidwinterbottom-Antwort können Benutzer von Windows den folgenden Befehl verwenden:

mysql.exe --database=[database] -u [user] -p[password] -B -N -e "SHOW TABLES" \
| awk.exe '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' \
| mysql.exe -u [user] -p[password] --database=[database] &

Ersetzen Sie [Datenbank], [Benutzer] und [Kennwort] durch die tatsächlichen Werte.

Git-bash Benutzer können dieses bash-Skript herunterladen und problemlos ausführen.

0
Lost Koder

Ich denke, der schnellste Weg ist mit phpmyadmin und jQuery auf der Konsole.

Gehen Sie zur Tabellenstruktur und öffnen Sie die Chrome/Firefox-Entwicklerkonsole (normalerweise F12 auf der Tastatur):

  1. führen Sie diesen Code aus, um alle Felder mit falschem Zeichensatz auszuwählen und die Änderung zu starten:

    var elems = $('dfn'); var lastID = elems.length - 1;
    elems.each(function(i) {
        if ($(this).html() != 'utf8_general_ci') { 
           $('input:checkbox', $('td', $(this).parent().parent()).first()).attr('checked','checked');
        }       
    
        if (i == lastID) {
            $("button[name='submit_mult'][value='change']").click();
        }
    });
    
  2. wenn die Seite geladen ist, verwenden Sie diesen Code in der Konsole, um die richtige Kodierung auszuwählen:

    $("select[name*='field_collation']" ).val('utf8_general_ci');
    
  3. sparen

  4. Ändern Sie den Zeichensatz der Tabelle im Feld "Sortierung" auf der Registerkarte "Vorgang"

Getestet auf phpmyadmin 4.0 und 4.4, aber ich denke, funktioniert auf allen 4.x-Versionen

0
Luca Camillo

Mit phpmyadmin können Sie dies auf einfache Weise tun, wenn Sie nicht über die Befehlszeile oder über die Bearbeitung von INFORMATION_SCHEMA verfügen.

Hören Sie sich zuerst die Ratschläge vieler anderer Antworten an - hier können Sie wirklich alles vermasseln, also ein Backup machen. Machen Sie jetzt ein Backup Ihres Backups. Dies funktioniert wahrscheinlich auch nicht, wenn Ihre Daten anders codiert sind als das, an dem Sie sie ändern.

Beachten Sie, dass Sie die genauen Namen des fehlerhaften Schemas und der Zeichencodierung ermitteln müssen, die Sie vor dem Start ändern müssen.

  1. Exportieren Sie die Datenbank als SQL. Eine Kopie machen; Öffnen Sie es in einem Texteditor Ihrer Wahl
  2. Suchen und Ersetzen Sie das Schema zuerst, zum Beispiel - find: latin1_swedish_ci , ersetzen Sie: utf8_general_ci
  3. Suchen und Ersetzen Sie die Zeichencodierungen, wenn Sie beispielsweise suchen müssen: latin1 , ersetzen Sie: utf8
  4. Erstellen Sie eine neue Testdatenbank und laden Sie Ihre neue SQL-Datei in phpmyadmin hoch

Dies ist eine sehr einfache Möglichkeit, dies zu tun. Die Kodierung Ihrer Daten wird dadurch jedoch nicht geändert, sodass sie nur unter bestimmten Umständen funktioniert.

0
squarecandy

Danke an @nlaq für den Code, der mich mit der untenstehenden Lösung gestartet hat.

Ich habe ein WordPress-Plugin veröffentlicht, ohne zu wissen, dass WordPress die Sortierung nicht automatisch setzt. Viele Leute, die das Plugin benutzten, endeten mit latin1_swedish_ci, wenn es utf8_general_ci hätte sein sollen.

Hier ist der Code, den ich zum Plugin hinzugefügt habe, um die latin1_swedish_ci-Sortierung zu erkennen und in utf8_general_ci zu ändern.

Testen Sie diesen Code, bevor Sie ihn in Ihrem eigenen Plugin verwenden!

// list the names of your wordpress plugin database tables (without db prefix)
$tables_to_check = array(
    'social_message',
    'social_facebook',
    'social_facebook_message',
    'social_facebook_page',
    'social_google',
    'social_google_mesage',
    'social_Twitter',
    'social_Twitter_message',
);
// choose the collate to search for and replace:
$convert_fields_collate_from = 'latin1_swedish_ci';
$convert_fields_collate_to = 'utf8_general_ci';
$convert_tables_character_set_to = 'utf8';
$show_debug_messages = false;
global $wpdb;
$wpdb->show_errors();
foreach($tables_to_check as $table) {
    $table = $wpdb->prefix . $table;
    $indicies = $wpdb->get_results(  "SHOW INDEX FROM `$table`", ARRAY_A );
    $results = $wpdb->get_results( "SHOW FULL COLUMNS FROM `$table`" , ARRAY_A );
    foreach($results as $result){
        if($show_debug_messages)echo "Checking field ".$result['Field'] ." with collat: ".$result['Collation']."\n";
        if(isset($result['Field']) && $result['Field'] && isset($result['Collation']) && $result['Collation'] == $convert_fields_collate_from){
            if($show_debug_messages)echo "Table: $table - Converting field " .$result['Field'] ." - " .$result['Type']." - from $convert_fields_collate_from to $convert_fields_collate_to \n";
            // found a field to convert. check if there's an index on this field.
            // we have to remove index before converting field to binary.
            $is_there_an_index = false;
            foreach($indicies as $index){
                if ( isset($index['Column_name']) && $index['Column_name'] == $result['Field']){
                    // there's an index on this column! store it for adding later on.
                    $is_there_an_index = $index;
                    $wpdb->query( $wpdb->prepare( "ALTER TABLE `%s` DROP INDEX %s", $table, $index['Key_name']) );
                    if($show_debug_messages)echo "Dropped index ".$index['Key_name']." before converting field.. \n";
                    break;
                }
            }
            $set = false;

            if ( preg_match( "/^varchar\((\d+)\)$/i", $result['Type'], $mat ) ) {
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` VARBINARY({$mat[1]})" );
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` VARCHAR({$mat[1]}) CHARACTER SET {$convert_tables_character_set_to} COLLATE {$convert_fields_collate_to}" );
                $set = true;
            } else if ( !strcasecmp( $result['Type'], "CHAR" ) ) {
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` BINARY(1)" );
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` VARCHAR(1) CHARACTER SET {$convert_tables_character_set_to} COLLATE {$convert_fields_collate_to}" );
                $set = true;
            } else if ( !strcasecmp( $result['Type'], "TINYTEXT" ) ) {
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` TINYBLOB" );
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` TINYTEXT CHARACTER SET {$convert_tables_character_set_to} COLLATE {$convert_fields_collate_to}" );
                $set = true;
            } else if ( !strcasecmp( $result['Type'], "MEDIUMTEXT" ) ) {
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` MEDIUMBLOB" );
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` MEDIUMTEXT CHARACTER SET {$convert_tables_character_set_to} COLLATE {$convert_fields_collate_to}" );
                $set = true;
            } else if ( !strcasecmp( $result['Type'], "LONGTEXT" ) ) {
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` LONGBLOB" );
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` LONGTEXT CHARACTER SET {$convert_tables_character_set_to} COLLATE {$convert_fields_collate_to}" );
                $set = true;
            } else if ( !strcasecmp( $result['Type'], "TEXT" ) ) {
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` BLOB" );
                $wpdb->query( "ALTER TABLE `{$table}` MODIFY `{$result['Field']}` TEXT CHARACTER SET {$convert_tables_character_set_to} COLLATE {$convert_fields_collate_to}" );
                $set = true;
            }else{
                if($show_debug_messages)echo "Failed to change field - unsupported type: ".$result['Type']."\n";
            }
            if($set){
                if($show_debug_messages)echo "Altered field success! \n";
                $wpdb->query( "ALTER TABLE `$table` MODIFY {$result['Field']} COLLATE $convert_fields_collate_to" );
            }
            if($is_there_an_index !== false){
                // add the index back.
                if ( !$is_there_an_index["Non_unique"] ) {
                    $wpdb->query( "CREATE UNIQUE INDEX `{$is_there_an_index['Key_name']}` ON `{$table}` ({$is_there_an_index['Column_name']})", $is_there_an_index['Key_name'], $table, $is_there_an_index['Column_name'] );
                } else {
                    $wpdb->query( "CREATE UNIQUE INDEX `{$is_there_an_index['Key_name']}` ON `{$table}` ({$is_there_an_index['Column_name']})", $is_there_an_index['Key_name'], $table, $is_there_an_index['Column_name'] );
                }
            }
        }
    }
    // set default collate
    $wpdb->query( "ALTER TABLE `{$table}` DEFAULT CHARACTER SET {$convert_tables_character_set_to} COLLATE {$convert_fields_collate_to}" );
    if($show_debug_messages)echo "Finished with table $table \n";
}
$wpdb->hide_errors();
0
dtbaker

Eine einfache (dumme? :) Lösung, die die Multi-Select-Funktion Ihrer IDE verwendet: 

  1. führen Sie "SHOW TABLES" aus. Abfrage und Kopie der Ergebnisspalte (Tabellennamen).
  2. multi-Select-Anfänge und fügen Sie "ALTER TABLE" hinzu.
  3. endungen mehrfach auswählen und "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;"
  4. erstellte Abfragen ausführen.
0
snp0k