2008-09-19 52 views
55

是否有SQLPHP脚本可以运行,这将更改数据库中所有表和字段中的默认排序规则?用于将所有表和字段更改为MYSQL中的utf-8-bin排序规则的脚本

我可以自己写一个,但我认为这应该是在这样的网站很容易得到的东西。如果我能在有人发帖之前自己想出一个,我会自己发布。

+0

[点击这里查看脚本并按照下面的步骤](http://stackoverflow.com/a/37049697/5737771) – 2016-05-05 11:46:52

回答

24

小心!如果你实际上已经将utf存储为另一种编码,那么你的手中可能会有一些混乱。先备份。然后尝试一些标准方法:

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

我不得不求助于将所有文本字段为二进制,然后再返回到VARCHAR /文字。这救了我的屁股。

我有数据是UTF8,存储为latin1。我做了什么:

删除索引。 将字段转换为二进制。 转换为utf8-general ci

如果您在LAMP上,不要忘记在与db进行交互之前添加设置NAMES命令,并确保设置了字符编码标头。

14

此PHP代码片段将更改数据库中所有表的排序规则。 (取自this site

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

当我在我的数据库上运行它时,当我尝试查看每个表的结构时,请参阅:#126 - 表'/tmp/#sql_321_0.MYI'的密钥文件不正确;尝试修复它 – YankeeWhiskey 2013-03-28 15:22:15

1

字符集和排序规则不是一回事。排序规则是关于如何对字符串进行排序的一组规则。字符集是一组关于如何表示字符的规则。整理依赖于字符集。

27

好的,我在写这篇文章时考虑了这个主题中所说的内容。感谢您的帮助,我希望这个脚本能够帮助其他人。我对它的使用没有任何保证,所以请在运行之前备份。它应该与所有数据库一起工作;而且它在我自己的工作很棒。

编辑:在顶部添加了字符集/整理转换为的变量。 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>"; 

?> 
+0

是的;到现在为止还挺好。我一直使用它到我的数据库,迄今没有数据丢失。 – nlaq 2008-10-07 07:44:16

+4

注意:通过查看源代码,在我看来,这个脚本不会重新创建多列唯一索引,它只会删除它们。 – knb 2011-01-11 18:41:57

+0

Great Post!有没有人改变这个脚本来处理“多列唯一索引”?是的,请发邮件或通过电子邮件发送到gmail - jjwdesign。谢谢,杰夫 – jjwdesign 2012-01-29 16:39:25

85

可以在单个命令(而不是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;

39

我认为这是很容易做到这一点在评价准备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:
该查询将输出查询的列表,每一个表。您必须复制查询列表,然后将它们粘贴到命令行或粘贴到PhpMyAdmin的SQL选项卡以进行更改。上面的脚本的

1

在选择convertation所有表上面的脚本(与SHOW TABLES),但是在转换表之前检查表格归类的更方便和便携的方式。这个查询做的:

SELECT table_name 
    , table_collation 
FROM information_schema.tables 
4

另一种方法使用命令行的基础上,@大卫没有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 
0

使用个性化的外壳collatedb,它应该工作:

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

例子:

collatedb root 0000 myDatabase utf8_bin 
0

感谢@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(); 
0

一个简单的(哑:)解决方案,使用你的IDE的多选功能:

  1. 运行 “SHOW TABLES;”查询和复制结果列(表名)。
  2. 多选开始并添加“ALTER TABLE”。
  3. 多重选择结束并添加“CONVERT到CHARACTER SET utf8 COLLATE utf8_general_ci;”
  4. 运行创建的查询。
0

我认为最快的方法是用phpmyadmin和控制台上的一些jQuery。

转到表的结构和开放式镀铬/ 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. 更改表上的 “操作” “归类” 字段标签的charset

测试在phpmyadmin的4.0和4.4,但我认为在所有4.x的版本工作

0

如果您没有命令行访问权限或无法编辑INFORMATION_SCHEMA,则只需使用phpmyadmin即可完成此操作。

首先,听听许多其他答案的建议 - 你真的可以把事情搞砸在这里,所以做一个备份。现在备份您的备份。如果您的数据编码与您要更改的数据编码方式不同,这也不太可能奏效。

请注意,您需要查找在开始之前需要更改的有问题架构和字符编码的确切名称。

  1. 将数据库导出为SQL;制作副本;在您选择的文本编辑器打开它
  2. 查找和第一更换模式,例如 - 发现:latin1_swedish_ci,替换:utf8_general_ci
  3. 找到,如果你需要,例如替换字符编码 - 发现:LATIN1,替换:UTF8
  4. 创建一个新的测试数据库并上传你的新的SQL文件到phpmyadmin的

这是一个超级简单这样做的方式,但再次,这不会改变您的数据的编码,所以它只会在某些情况下工作。

0

我更新了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>"; 

?> 
0

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

替换[数据库],[用户]和[密码]用占位符实际值。

Git-bash用户可以下载这个bash script并轻松运行。