برنامج نصي لتغيير جميع الجداول والحقول إلى ترتيب utf-8-bin في MYSQL

StackOverflow https://stackoverflow.com/questions/105572

سؤال

هل يوجد SQL أو PHP البرنامج النصي الذي يمكنني تشغيله والذي سيغير الترتيب الافتراضي في كافة الجداول والحقول في قاعدة البيانات؟

يمكنني أن أكتب واحدة بنفسي، ولكن أعتقد أن هذا يجب أن يكون متاحًا بسهولة في موقع مثل هذا.إذا كان بإمكاني التوصل إلى واحدة بنفسي قبل أن ينشرها شخص ما، فسوف أقوم بنشرها بنفسي.

هل كانت مفيدة؟

المحلول

احرص!إذا قمت بالفعل بتخزين utf كتشفير آخر، فقد يكون هناك فوضى حقيقية بين يديك.النسخ الاحتياطي أولا.ثم جرب بعض الطرق القياسية:

على سبيل المثالhttp://www.cesspit.net/drupal/node/898 http://www.hackszine.com/blog/archive/2007/05/mysql_database_migration_latin.html

لقد اضطررت إلى اللجوء إلى تحويل كافة الحقول النصية إلى ثنائي، ثم العودة إلى varchar/text.لقد أنقذ هذا مؤخرتي.

كان لدي بيانات UTF8، مخزنة كـ latin1.ماذا فعلت:

إسقاط الفهارس.تحويل الحقول إلى ثنائي.تحويل إلى utf8-general ci

إذا كنت تستخدم LAMP، فلا تنس إضافة أمر set NAMES قبل التفاعل مع قاعدة البيانات، وتأكد من تعيين رؤوس ترميز الأحرف.

نصائح أخرى

يمكن تنفيذه بأمر واحد (بدلاً من 148 PHP):

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 &

عليك أن تحب سطر الأوامر...(قد تحتاج إلى استخدام --user و --password خيارات ل mysql).

يحرر:وأضاف لتجنب مشاكل المفاتيح الخارجية SET foreign_key_checks = 0; و SET foreign_key_checks = 1;

أعتقد أنه من السهل القيام بذلك في خطوتين في PhpMyAdmin.
الخطوة 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

الخطوة 2:
سيقوم هذا الاستعلام بإخراج قائمة من الاستعلامات، واحدة لكل جدول.يجب عليك نسخ قائمة الاستعلامات ولصقها في سطر الأوامر أو في علامة تبويب SQL الخاصة بـ PhpMyAdmin لإجراء التغييرات.

حسنًا، لقد كتبت هذا مع مراعاة ما قيل في هذا الموضوع.شكرًا للمساعدة، وآمل أن يساعد هذا البرنامج النصي الآخرين.ليس لدي أي ضمان لاستخدامه، لذا يرجى إجراء نسخة احتياطية قبل تشغيله.هو - هي يجب العمل مع جميع قواعد البيانات.وقد عملت بشكل رائع بمفردي.

يحرر:تمت إضافة vars في الجزء العلوي الذي سيتم تحويل مجموعة الأحرف/الترتيب إليه.تحرير 2:تغيير مجموعة الأحرف/الترتيب الافتراضية لقاعدة البيانات والجداول

<?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>";

?>

سيؤدي مقتطف PHP هذا إلى تغيير الترتيب على كافة الجداول في قاعدة بيانات.( هو مأخوذ من هذا الموقع.)

<?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 />";
    }
}
?> 

هناك طريقة أخرى تستخدم سطر الأوامر، بناءً على @david بدون 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

جميل

  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

يمكن العثور على نسخة أكثر اكتمالاً من البرنامج النصي أعلاه هنا:

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

يرجى ترك أي تعليقات حول هذه المساهمة هنا:http://www.zen-cart.com/forum/showthread.php?p=1034214

مجموعة الأحرف والترتيب ليسا نفس الشيء.الترتيب هو مجموعة من القواعد حول كيفية فرز السلاسل.مجموعة الأحرف عبارة عن مجموعة من القواعد حول كيفية تمثيل الأحرف.يعتمد الترتيب على مجموعة الأحرف.

في البرامج النصية فوق كافة الجداول المحددة للتحويل (مع SHOW TABLES)، ولكنها طريقة أكثر ملاءمة ومحمولة للتحقق من ترتيب الجدول قبل تحويل الجدول.هذا الاستعلام يفعل ذلك:

SELECT table_name
     , table_collation 
FROM information_schema.tables

استخدم قوقعتي المخصصة مرتب ب, ، يجب أن تعمل :

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

مثال :

collatedb root 0000 myDatabase utf8_bin

شكرًا @nlaq على الكود، الذي جعلني أبدأ في الحل أدناه.

لقد قمت بإصدار مكون إضافي لـ WordPress دون أن أدرك أن WordPress لا يقوم بتعيين الترتيب تلقائيًا.لذلك انتهى الأمر بالكثير من الأشخاص الذين يستخدمون البرنامج المساعد latin1_swedish_ci عندما كان ينبغي أن يكون utf8_general_ci.

إليك الرمز الذي أضفته إلى البرنامج المساعد لاكتشاف ملف latin1_swedish_ci تجميع وتغييره إلى utf8_general_ci.

اختبر هذا الرمز قبل استخدامه في البرنامج المساعد الخاص بك!

// 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();

بسيطة (غبية؟:) الحل، باستخدام ميزة التحديد المتعدد في IDE الخاص بك:

  1. تشغيل "الجداول عرض ؛" عمود نتائج الاستعلام ونسخ (أسماء الجدول).
  2. البدايات متعددة التحديد وأضف "ALTER TABLE".
  3. نهايات متعددة التحديد وإضافة "تحويل إلى مجموعة الأحرف utf8 COLLATE utf8_general_ci;"
  4. تشغيل الاستعلامات التي تم إنشاؤها.

إليك طريقة سهلة للقيام بذلك باستخدام phpmyadmin فقط إذا لم يكن لديك حق الوصول إلى سطر الأوامر أو الوصول لتحرير INFORMATION_SCHEMA.

أولاً، استمع إلى نصائح العديد من الإجابات الأخرى هنا - يمكنك حقًا إفساد الأمور هنا، لذا قم بعمل نسخة احتياطية.الآن قم بعمل نسخة احتياطية من النسخة الاحتياطية الخاصة بك.ومن غير المحتمل أيضًا أن ينجح هذا إذا تم تشفير بياناتك بشكل مختلف عما تقوم بتغييرها إليه.

لاحظ أنك ستحتاج إلى العثور على الأسماء الدقيقة للمخطط المخالف وترميز الأحرف الذي تحتاج إلى تغييره قبل البدء.

  1. تصدير قاعدة البيانات بتنسيق SQL؛اعمل نسخة؛افتحه في محرر النصوص الذي تختاره
  2. ابحث عن المخطط واستبدله أولاً، على سبيل المثال - ابحث عن: latin1_swedish_ci, ، يستبدل: utf8_general_ci
  3. ابحث عن ترميزات الأحرف واستبدلها إذا كنت بحاجة إلى ذلك، على سبيل المثال - ابحث عن: لاتينية1, ، يستبدل: utf8
  4. أنشئ قاعدة بيانات اختبارية جديدة وقم بتحميل ملف SQL الجديد إلى phpmyadmin

هذه طريقة سهلة للغاية للقيام بذلك، ولكن مرة أخرى، لن يغير هذا تشفير بياناتك، لذلك لن يعمل إلا في ظروف معينة.

أعتقد أن أسرع طريقة هي باستخدام phpmyadmin وبعض jQuery على وحدة التحكم.

انتقل إلى بنية الجدول وافتح وحدة تحكم مطوري Chrome/Firefox (عادةً F12 على لوحة المفاتيح):

  1. قم بتشغيل هذا الرمز لتحديد جميع الحقول التي تحتوي على مجموعة أحرف غير صحيحة وابدأ التعديل:

    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. عند تحميل الصفحة، استخدم هذا الرمز على وحدة التحكم لتحديد التشفير الصحيح:

    $("select[name*='field_collation']" ).val('utf8_general_ci');
    
  3. يحفظ

  4. قم بتغيير مجموعة أحرف الجدول في حقل "الترتيب" في علامة التبويب "العملية".

تم الاختبار على phpmyadmin 4.0 و4.4، ولكن أعتقد أنه يعمل على جميع إصدارات 4.x

لقد قمت بتحديث إجابة nlaq للعمل مع PHP7 وللتعامل بشكل صحيح مع المؤشرات متعددة الأعمدة والبيانات الثنائية المجمعة (على سبيل المثال. latin1_bin)، وما إلى ذلك، وقمت بتنظيف الكود قليلاً.هذا هو الكود الوحيد الذي وجدته/جربته والذي نجح في ترحيل قاعدة البيانات الخاصة بي من latin1 إلى utf8.

<?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>";

?>

لمستخدمي ويندوز

بالإضافة إلى DavidWinterBottom Answer ، يمكن لمستخدمي Windows استخدام الأمر أدناه:

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] &

استبدل العناصر النائبة لـ [قاعدة البيانات] و[المستخدم] و[كلمة المرور] بالقيم الفعلية.

جيت باش يمكن للمستخدمين تنزيل هذا البرنامج النصي باش وتشغيله بسهولة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top