복붙노트

[SQL] 스크립트는 MYSQL에서 UTF-8 단 정렬 모든 테이블과 필드를 변경합니다

SQL

스크립트는 MYSQL에서 UTF-8 단 정렬 모든 테이블과 필드를 변경합니다

내가 그 데이터베이스의 모든 테이블과 필드의 기본 데이터 정렬을 변경됩니다 실행할 수있는 SQL 또는 PHP 스크립트가 있습니까?

나는 하나를 자신을 쓸 수 있지만 문제는이 같은 사이트가 쉽게 사용할 수 뭔가를해야한다고 생각합니다. 나는 사람의 게시물 일 이전에 하나의 자신을 가지고 올 수 있다면, 내가 직접 게시 할 예정입니다.

해결법

  1. ==============================

    1.조심해! 실제로 다른 인코딩으로 저장 UTF이있는 경우, 당신은 당신의 손에 진짜 엉망이있을 수 있습니다. 첫 번째 백업합니다. 그런 다음 표준 방법 중 일부를 시도 :

    조심해! 실제로 다른 인코딩으로 저장 UTF이있는 경우, 당신은 당신의 손에 진짜 엉망이있을 수 있습니다. 첫 번째 백업합니다. 그런 다음 표준 방법 중 일부를 시도 :

    예를 들면 http://www.cesspit.net/drupal/node/898 http://www.hackszine.com/blog/archive/2007/05/mysql_database_migration_latin.html

    나는 다시 VARCHAR / 텍스트, 바이너리 모든 텍스트 필드를 변환 할 수 밖에 없었습니다. 이 내 엉덩이를 저장하고있다.

    내가 데이터를했다 라틴어로 저장 UTF8이다. 제가 한:

    인덱스를 삭제합니다. 바이너리에 필드를 변환합니다. UTF8 - 일반 CI로 변환

    당신의 램프에 경우, DB와 상호 작용하기 전에 설정 이름은 명령을 추가하는 것을 잊지하고, 당신이 세트 문자 인코딩 헤더를하지 않습니다.

  2. ==============================

    2.하나의 명령 (보다는 PHP 148)에서 수행 할 수 있습니다 :

    하나의 명령 (보다는 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 &
    

    당신은 명령 줄을 사랑하고있어 ... (당신은 MySQL을위한 --user 및 --password 옵션을 채택해야 할 수도 있습니다).

    편집 : 외래 키 문제, 추가 SET의 FOREIGN_KEY_CHECKS = 0을 피하기 위해; 및 SET의 FOREIGN_KEY_CHECKS = 1;

  3. ==============================

    3.나는 phpMyAdmin을 runin 두 단계로이 일을 쉽게 생각합니다. 1 단계:

    나는 phpMyAdmin을 runin 두 단계로이 일을 쉽게 생각합니다. 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 단계: 이 쿼리가 출력 쿼리의 목록, 각 테이블에 대해 하나. 당신은 쿼리의 목록을 복사하고, 변경이 될 수 있도록 phpMyAdmin과의 SQL 탭 명령 줄에 나에 붙여 넣기합니다.

  4. ==============================

    4.OK,이 스레드에서 무슨 말을했는지 고려까지이 썼다. 도움을 주셔서 감사합니다, 나는이 스크립트는 다른 사람을 도움이되기를 바랍니다. 그래서 그것을 실행하기 전에 백업을 기쁘게도, 그 사용에 대한 보증을하지 않습니다. 그것은 모든 데이터베이스와 함께 작동한다; 그리고 그것은 내 자신에 좋은 일했다.

    OK,이 스레드에서 무슨 말을했는지 고려까지이 썼다. 도움을 주셔서 감사합니다, 나는이 스크립트는 다른 사람을 도움이되기를 바랍니다. 그래서 그것을 실행하기 전에 백업을 기쁘게도, 그 사용에 대한 보증을하지 않습니다. 그것은 모든 데이터베이스와 함께 작동한다; 그리고 그것은 내 자신에 좋은 일했다.

    편집 : 캐릭터 / 부씩로 변환하는 추가는 상단에 바르. EDIT2가 : 데이터베이스의와 테이블을 '변경 디폴트 캐릭터 세트 / 부씩

    <?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>";
    
    ?>
    
  5. ==============================

    5.이 PHP 조각은 DB의 모든 테이블에 데이터 정렬을 변경합니다. (그것은이 사이트에서 가져온 것.)

    이 PHP 조각은 DB의 모든 테이블에 데이터 정렬을 변경합니다. (그것은이 사이트에서 가져온 것.)

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

    6.AWK없이 다윗의 @에 따라 명령 줄을 사용하여 또 다른 방법,

    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
    

    prettified

      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
    
  7. ==============================

    7.위의 스크립트의 더 완전한 버전은 여기에서 찾을 수 있습니다 :

    위의 스크립트의 더 완전한 버전은 여기에서 찾을 수 있습니다 :

    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

  8. ==============================

    8.문자 집합 및 정렬은 같은 것이 아니다. 데이터 정렬 문자열을 정렬하는 방법에 대한 규칙의 집합입니다. 캐릭터 세트는 문자를 표현하는 방법에 대한 규칙의 집합입니다. 데이터 정렬은 문자 집합에 따라 달라집니다.

    문자 집합 및 정렬은 같은 것이 아니다. 데이터 정렬 문자열을 정렬하는 방법에 대한 규칙의 집합입니다. 캐릭터 세트는 문자를 표현하는 방법에 대한 규칙의 집합입니다. 데이터 정렬은 문자 집합에 따라 달라집니다.

  9. ==============================

    9.(SHOW 테이블과) 대화를 위해 선택한 모든 테이블,하지만 테이블을 변환하기 전에 테이블 정렬을 확인하는보다 편리하고 휴대 위의 방법으로 스크립트에서. 이 쿼리를 수행합니다

    (SHOW 테이블과) 대화를 위해 선택한 모든 테이블,하지만 테이블을 변환하기 전에 테이블 정렬을 확인하는보다 편리하고 휴대 위의 방법으로 스크립트에서. 이 쿼리를 수행합니다

    SELECT table_name
         , table_collation 
    FROM information_schema.tables
    
  10. ==============================

    10.내 사용자 지정 쉘 collatedb를 사용하여, 그것을 작동합니다 :

    내 사용자 지정 쉘 collatedb를 사용하여, 그것을 작동합니다 :

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

    예 :

    collatedb root 0000 myDatabase utf8_bin
    
  11. ==============================

    11.덕분에 저를 아래의 솔루션에서 시작되었다 코드에 대한 @nlaq.

    덕분에 저를 아래의 솔루션에서 시작되었다 코드에 대한 @nlaq.

    나는 워드 프레스 자동으로 한 부씩 인쇄를 설정하지 않는 것을 실현하지 않고 플러그인 워드 프레스를 발표했다. 플러그인을 사용하여 많은 사람들이 latin1_swedish_ci로 결국 그래서 utf8_general_ci를 했어야합니다.

    다음은 latin1_swedish_ci 한 부씩 인쇄를 감지하고 utf8_general_ci로 변경하는 플러그인에 추가 된 코드 I입니다.

    자신의 플러그인에서 사용하기 전에이 코드를 테스트!

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

    12.귀하의 IDE의 다중 선택 기능을 사용하여 간단한 (바보 :) 솔루션?

    귀하의 IDE의 다중 선택 기능을 사용하여 간단한 (바보 :) 솔루션?

  13. ==============================

    13.다음은 편집 INFORMATION_SCHEMA에 대한 명령 줄 액세스 또는 액세스 할 수없는 경우 단지 phpMyAdmin을 사용하여이 작업을 수행 할 수있는 쉬운 방법입니다.

    다음은 편집 INFORMATION_SCHEMA에 대한 명령 줄 액세스 또는 액세스 할 수없는 경우 단지 phpMyAdmin을 사용하여이 작업을 수행 할 수있는 쉬운 방법입니다.

    첫째, 여기에 다른 답변의 많은 조언을 듣고 - 당신은 정말 그렇게 백업을, 여기에 일을 망칠 수 있습니다. 이제 백업의 백업을합니다. 데이터가 당신에게 무엇을 변경하고 있는지 다르게 인코딩 된 경우 또한이 작업을 않을 수 있습니다.

    당신은 당신이 시작하기 전에에서 변화를 필요로하는 기분을 상하게 스키마와 문자 인코딩의 정확한 이름을 찾을 필요가 있습니다.

    ,이 그것을 할 수있는 매우 쉬운 방법이지만, 다시,이 데이터의 인코딩을 변경하지 않습니다 특정 상황에서 그것만이 작업 때문에.

  14. ==============================

    14.나는 가장 빠른 방법은 phpMyAdmin을 콘솔에 대한 몇 가지 jQuery를 함께 생각합니다.

    나는 가장 빠른 방법은 phpMyAdmin을 콘솔에 대한 몇 가지 jQuery를 함께 생각합니다.

    테이블의 구조와 개방형 크롬 / 파이어 폭스 개발자 콘솔 (키보드에서 일반적으로 F12)로 이동

    phpMyAdmin을 4.0과 4.4에서 테스트,하지만 난 모든 4.x의 버전에 대한 작업을 생각한다

  15. ==============================

    15.나는 PHP7와 함께 작동하도록 nlaq의 답변을 업데이트하고 제대로 멀티 컬럼 인덱스, 이진 부씩 데이터를 처리하기 위해 (예를 들어 latin1_bin) 등, 및 코드를 조금 정리. 이것은 내가 성공적으로 라틴에서 UTF8로 내 데이터베이스를 마이그레이션 것을 시도 / 발견하는 유일한 코드입니다.

    나는 PHP7와 함께 작동하도록 nlaq의 답변을 업데이트하고 제대로 멀티 컬럼 인덱스, 이진 부씩 데이터를 처리하기 위해 (예를 들어 latin1_bin) 등, 및 코드를 조금 정리. 이것은 내가 성공적으로 라틴에서 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>";
    
    ?>
    
  16. ==============================

    16.@davidwinterbottom 대답뿐만 아니라, Windows 사용자는 명령을 아래에 사용할 수 있습니다 :

    @davidwinterbottom 대답뿐만 아니라, 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] &
    

    [데이터베이스], [사용자]과 실제 값 [암호] 자리 바꾸기.

    망할 놈의-bash는 사용자는이 bash는 스크립트를 다운로드 할 수 있으며, 쉽게 실행합니다.

  17. from https://stackoverflow.com/questions/105572/a-script-to-change-all-tables-and-fields-to-the-utf-8-bin-collation-in-mysql by cc-by-sa and MIT license