source

MYSQL에서 모든 테이블과 필드를 utf-8-bin 대조로 변경하는 스크립트

gigabyte 2022. 11. 8. 21:09
반응형

MYSQL에서 모든 테이블과 필드를 utf-8-bin 대조로 변경하는 스크립트

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

제가 직접 쓸 수는 있지만, 이런 사이트에서 쉽게 구할 수 있는 것이어야 한다고 생각합니다.누가 올리기 전에 제가 직접 생각해 낼 수 있다면 제가 직접 올릴게요.

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

(사용할 수 없습니다)를 사용할 필요가 수 있습니다.--user ★★★★★★★★★★★★★★★★★」--passwordmysql를 참조해 주세요.

문제를 " " " 가 추가되었습니다.SET foreign_key_checks = 0; ★★★★★★★★★★★★★★★★★」SET foreign_key_checks = 1;

PhpMyAdmin에서 실행하는 것은 두 단계로 쉽게 할 수 있다고 생각합니다.
1 서 11:

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 서 22:
이 쿼리는 각 테이블에 하나씩 쿼리 목록을 출력합니다.변경 사항을 적용하려면 쿼리 목록을 복사하여 명령줄 또는 PhpMyAdmin의 SQL 탭에 붙여넣어야 합니다.

네, 저는 이 스레드에 적혀있는 것을 고려하여 이 글을 썼습니다.도와줘서 고맙고, 이 대본이 다른 사람들에게 도움이 되었으면 좋겠어요.사용에 대한 보증이 없으므로 실행하기 전에 백업하십시오.모든 데이터베이스와 함께 작동해야 하며, 저 스스로도 매우 잘 작동했습니다.

편집: 변환할 문자 집합/배열을 위한 변수를 맨 위에 추가했습니다.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>";

?>

조심해!실제로 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가 켜져 있는 경우 DB와 대화하기 전에 set NAMES 명령을 추가하는 것을 잊지 말고 문자 인코딩 헤더를 설정하십시오.

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

david라는 하지 않고 @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

위의 스크립트의 보다 완전한 버전은 다음 URL에서 확인할 수 있습니다.

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

Charset과 조합은 같은 것이 아닙니다.대조는 문자열을 정렬하는 방법에 대한 규칙 집합입니다.문자 집합은 문자를 표현하는 방법에 대한 규칙 집합입니다.대조는 문자 집합에 따라 달라집니다.

된 모든 (with '가 있는' 테이블)의SHOW TABLES테이블을 변환하기 전에 테이블 대조 결과를 확인할 수 있는 보다 편리하고 휴대하기 쉬운 방법입니다.다음과 같은 내용이 됩니다.

SELECT table_name
     , table_collation 
FROM information_schema.tables

커스텀 셸 collatedb를 사용하면 동작합니다.

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

예:

collatedb root 0000 myDatabase utf8_bin

@nlaq 코드 감사합니다.이것에 의해, 이하의 솔루션을 개시할 수 있었습니다.

워드프레스 플러그인이 자동으로 설정되지 않는다는 것을 깨닫지 못하고 워드프레스 플러그인을 출시했습니다. 이 이 결국 이 플러그인이 되었다.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. "SHOW TABLES;" 쿼리 및 복사 결과 열(테이블 이름)을 실행합니다.
  2. 시작을 여러 개 선택하고 "ALTER TABLE"을 추가합니다.
  3. 엔딩을 여러 개 선택하고 "CONVERT TO CHARATER SET utf8 COLATE utf8_general_ci;"를 추가합니다.
  4. 생성된 쿼리를 실행합니다.

명령줄 액세스 또는 INFORMATION_SCHEMA 편집 액세스 권한이 없는 경우 phpmyadmin만으로 간단하게 이 작업을 수행할 수 있는 방법이 있습니다.

먼저, 다른 많은 답변의 조언을 들어주세요.여기서는 일을 망칠 수 있으니 백업을 해 주세요.이제 백업을 만듭니다.또한 데이터가 변경하려는 데이터와 다르게 인코딩되어 있는 경우에도 이 방법은 작동하지 않습니다.

시작하기 전에 변경해야 하는 문제의 스키마 및 문자 인코딩의 정확한 이름을 찾아야 합니다.

  1. 데이터베이스를 SQL로 내보내고, 복사본을 만들고, 선택한 텍스트 편집기에서 열기
  2. 먼저 스키마를 찾아서 바꿉니다(예: find: latin1_swedish_ci, replace: utf8_general_ci).
  3. 필요한 경우 문자 인코딩을 찾아서 바꿉니다(예: find: latin1, replace: 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 버전 모두에서 동작할 수 있을 것 같습니다.

PHP7과 연계하여 멀티컬럼 인덱스, 바이너리 대조 데이터(예: nlaq)를 올바르게 처리하도록 nlaq의 답변을 업데이트했습니다.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>";

?>

Windows 사용자용

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

[database], [user] 및 [password] 자리 표시자를 실제 값으로 바꿉니다.

Git-bash 사용자는 이 bash 스크립트를 다운로드하여 쉽게 실행할 수 있습니다.

여기에서는 https://stackoverflow.com/a/42545503/6226915의 확장 버전을 Yii2 ConsoleController 클래스로 제공합니다.이 클래스는 스탠드아론으로도 사용할 수 있습니다.https://gist.github.com/cboulanger/d30c197235a53d9a2331f19a96d6e00d

이 스크립트는 몇 가지 버그를 수정하고 전체 텍스트 인덱스에 대한 지원을 추가합니다.또한 일반 인덱스 키 길이 3kb에 대한 제약도 처리합니다.또한 모든 테이블을 InnoDB로 변환합니다.

PHP Larabel 프레임워크의 경우:

  1. 이행 사용:php artisan make:migration update_character_set_utf8_m4

  2. 이행 파일 로직

    $DBNAME = config('database.connections.mysql.database');
    $CHARACTER = 'utf8mb4';
    $COLLATE = 'utf8mb4_unicode_ci';
    
    echo "Altering DB $DBNAME\n";
    DB::unprepared("ALTER DATABASE $DBNAME CHARACTER SET $CHARACTER COLLATE $COLLATE;");
    
    $tables = DB::select("SELECT table_name FROM information_schema.tables WHERE table_schema = '{$DBNAME}'");
    foreach ($tables as $table) {
        echo "Altering $table->table_name\n";
        DB::unprepared("ALTER TABLE $table->table_name CONVERT TO CHARACTER SET $CHARACTER COLLATE $COLLATE;");
    }
    
  3. php artisan migrate

언급URL : https://stackoverflow.com/questions/105572/a-script-to-change-all-tables-and-fields-to-the-utf-8-bin-collation-in-mysql

반응형