Mysql数据库复制系统(可解决中文乱码)

Mysql在数据存储上可使用众多的字符集整理,由此也会产生很多意想不到的问题。
比如说以前的数据库使用的是默认的字符集latin,如果现在想要这些数据库使用中文来存储以方便阅读和即时修改,那么该如何处理呢?
为此,我编写了一个PHP网页,可用来复制以前的数据库,它的特点是能重新设定数据库的整理方式,操作方便而且简单。在使用这个网页之前,必须做好以下两点准备:
1.创建一个新的数据库,结构上除了字符集整理方式是按自己需求所设定,其它的要与被复制数据库相同。
2.确保浏览器支持javascript。
3.确保网页上所选定的charset字符集与新建数据库的字符集整理方式相同。
网页代码如下:
<html>
<head>
<meta http-equiv="Content-Type" c>
<title>Database Copy System</title>
<script language="javascript">
<!--
function focusfirst(){
document.copydata.host.focus();
}
window.onload=focusfirst;
function showlist(menu){
var choice=menu.selectedIndex;
for(n=1;n<10;n++){     //10最好改为当前连接的数据库个数,也可以设置为一个比较大的数字
  var li=document.getElementById(menu.options[n].value);
  if(choice==i){
   li.style.display="block";
  }
  else
  {
   li.style.display="none";
  }
}
}
function showdst(){
dst.style.display="block";
chars.style.display="block";
per.style.display="block";
}
//-->
</script>
</head>
<body>
<?
echo "<form id='copydata' name='copydata' method='post'>";
echo "<table width='100%' style='font-family:Verdana;font-size:12px'>";
echo "<tr><th colspan='2'>Database Copy System For Mysql</th></tr>";
echo "<tr><td>Connect:</td><td>";
echo "<input type='text' id='host' name='host' value='127.0.0.1'>";
echo "<input type='text' id='user' name='user' value='root'>";
echo "<input type='password' id='pass' name='pass' value='root'>";
echo "<input type='submit' value='check'>";
echo "</td></tr>";
if($_POST[host]){
echo "<tr><td>";
$host=$_POST[host];
$user=$_POST[user];
$code=$_POST[pass];
$link=mysql_connect($host,$user,$code)or die("failed to connect!".mysql_error());
$db_list=mysql_list_dbs($link);
echo "DB_src:</td><td>";
echo "<select id='db' name='db' style='font-family:Verdana' onchange='showlist(db);'>";
echo "<option value='nodb' selected>select one db</option>";
while($dbs=mysql_fetch_object($db_list)){  //数据库
  $db=$dbs->Database;
  echo "<option value='$db'>$db</option>";
}
echo "</select>";
echo "</td></tr>";
$db_list=mysql_list_dbs($link);
while($dbsa=mysql_fetch_object($db_list)){
  $dba=$dbsa->Database;
  mysql_select_db($dba,$link);
  $table_list=mysql_query("show tables");
  echo "<tr id='$dba' name='$dba' style='display:none'><td>";
  echo "Tables of ".$dba.":</td><td>";
  echo "<select id='tables_".$dba."' name='tables_".$dba."' style='font-family:Verdana' onchange='showdst();'>";
  echo "<option value='nota' selected>select one table</option>";
  while($tables=mysql_fetch_row($table_list)){  //数据表
   echo "<option value='$tables[0]'>$tables[0]</option>";;
  }
  echo "</select>";
  echo "</td></tr>";
}
echo "<tr id='dst' name='dst' style='display:none'><td>";
echo "DB_dst:</td><td>";
echo "<select id='dst' name='dst' style='font-family:Verdana'>";
$db_list=mysql_list_dbs($link);
while($dbs=mysql_fetch_object($db_list)){  //数据库
  $db=$dbs->Database;
  echo "<option value='$db'>$db</option>";
}
echo "</select>";
echo "</td></tr>";
echo "<tr id='chars' name='chars' style='display:none'><td>select charset:</td>";
echo "<td><select id='char' name='char' style='font-family:Verdana'>";
$link=mysql_connect($host,$user,$code)or die("failed to connect!".mysql_error());
mysql_select_db("information_schema",$link);
$sqla="select * from CHARACTER_SETS";
$result=mysql_query($sqla,$link)or die(mysql_error());
while($chars=mysql_fetch_array($result)){
  echo "<option value='$chars[CHARACTER_SET_NAME]'>$chars[DEFAULT_COLLATE_NAME]</option>";
}
echo "</select>";
echo "</td></tr>";
echo "<tr id='per' name='per' style='display:none'>";
echo "<td colspan='2' align='center'><input type='submit' name='per' value='Perform'></td></tr>";
}
if($_POST[per]){
$host=$_POST[host];
$user=$_POST[user];
$code=$_POST[pass];
$db=$_POST[db];
$ta="tables_".$db;
$table=$_POST[$ta];
$dst=$_POST[dst];
$char=$_POST[char];
echo "<tr><td colspan='2'><hr></td></tr>";
echo "<tr><td> connect:</td><td>host:".$host."\tuser:".$user."</td></tr>";
echo "<tr><td> charset:</td><td>charset:".$char."</td></tr>";
echo "<tr><td> from:</td><td>database:".$db."\ttable:".$table."</td></tr>";
echo "<tr><td> to:</td><td>db:".$dst."\ttable:".$table."</td></tr>";
echo "<tr><td colspan='2'><hr></td></tr>";
$link=mysql_connect($host,$user,$code)or die("failed to connect!".mysql_error());
mysql_select_db($db,$link);
$column_list=mysql_query("show columns from $table");
$n=0;
while($cols=mysql_fetch_array($column_list)){
  $fa[$n]=$cols[Field];
  $n++;
}
$sql="select * from $table";
$result=mysql_query($sql,$link)or die(mysql_error());
while($rows=mysql_fetch_array($result)){
  for($i=0;$i<count($fa);$i++){
   if($i==0){
    $sa=$fa[0];
    $sb="'".$rows[$fa[0]]."'";
   }
   else
   {
    $sa=$sa.",".$fa[$i];
    $sb=$sb.",'".$rows[$fa[$i]]."'";
   }
  }
  $s="insert into $table (".$sa.")value(".$sb.")";
  $link=mysql_connect($host,$user,$code)or die("failed to connect!".mysql_error());
  mysql_query("set names '$char'");
  mysql_select_db($dst,$link);
  echo "<tr><td>ok</td><td>$s;";
  mysql_query($s,$link)or die("<br><font color='red'>failed to query</font>".mysql_error());
  echo "</td></tr>";
}
}
echo "</table>";
echo "</form>";
?>
</body>
</html>
<!--默认的连接可以自己设定-->
<!--DB_src为被复制数据库,DB_dst为新建数据库(即复制数据库)-->

[ 本帖最后由 霁雪寒 于 2008-4-8 09:24 编辑 ]