hanliu's personal blog

任何伟大都会被误解...Wiki Is All 注册 | 登陆
Contact me!

我,在某年某月来到这个世界。于某年某月创建了该BLOG,其间在BLOG的 10 个分类中发表的 513 篇文章被评论了 37 次。

原utf8数据库导入GBK字符集数据库的PHP小程序源代码

原utf8数据库导入GBK字符集数据库的PHP小程序源代码
题外话:Mysql版本4.1.12,我用phpMyAdmin2.6.2可以正常显示gbk字符集表中的内容,却不能正常显示原utf8字符集表中的内容(乱码)。用phpMyAdmin2.2.2就刚好相反,可以正常显示原utf8字符集表中的内容,却不能正常显示gbk字符集表中的内容(乱码)。所以只好两个版本都装了。

  php存取gbk字符集的数据库,需要在操作语句前加入如下语句,指定字符集,如果不指定,默认为utf8。
  mysql_query("SET NAMES gbk",$server_gbk);
  不知道可以不可以改变php存取mysql的默认字符集?不需要每次访问Mysql都要指定字符集,很麻烦。

正 文:

  在MySql 4.1之后的版本支持gbk,gb2312等字符集,为方便Jsp不需经过代码转换直接存取Mysql数据库(GBK字符集),需要将原utf8字符集(4.1之前的默认字符集)数据库转换为gbk字符集。

  在/usr/local/mysql/bin/mysql通过命令方式下,或者使用2.6.2以上版本的phpMyAdmin建立一个新的GBK字符集数据库,再使用phpMyAdmin导出脚本功能,导出表结构的脚本,会发现库脚本中指定字符集DEFAULT CHARSET=utf8。

CREATE TABLE MyTable  (
  ……
  (字段定义)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

将表结构脚本中 utf8 替换为 gbk,如下:
CREATE TABLE MyTable  (
  ……
  (字段定义)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

  利用改了字符集的表结构在新的GBK字符集数据库中建立相应表,于是您就拥有了与原utf8字符集数据库结构完全一直的gbk数据库。

  或者更简单的方法,直接使用phpMyAdmin2.6.2复制一个相同的数据库(只复制结构,不复制数据),再使用phpMyAdmin2.6.2的“操作”功能,将新的数据库和表的字符集都转换为gbk。

  剩下的工作就是需要将原utf8字符集数据库中的数据导入到新的GBK字符据数据库中。这个工作可以用一个php小程序来完成。

  假定原utf8字符集的数据库名:db_utf8,新的gbk字符集的数据库名:db_gbk,php程序调用方式:togbk.php?tab=MyTable,转换表MyTable的数据。 原utf8数据库导入GBK字符集数据库的PHP小程序源代码
题外话:Mysql版本4.1.12,我用phpMyAdmin2.6.2可以正常显示gbk字符集表中的内容,却不能正常显示原utf8字符集表中的内容(乱码)。用phpMyAdmin2.2.2就刚好相反,可以正常显示原utf8字符集表中的内容,却不能正常显示gbk字符集表中的内容(乱码)。所以只好两个版本都装了。

  php存取gbk字符集的数据库,需要在操作语句前加入如下语句,指定字符集,如果不指定,默认为utf8。
  mysql_query("SET NAMES gbk",$server_gbk);
  不知道可以不可以改变php存取mysql的默认字符集?不需要每次访问Mysql都要指定字符集,很麻烦。

正 文:

  在MySql 4.1之后的版本支持gbk,gb2312等字符集,为方便Jsp不需经过代码转换直接存取Mysql数据库(GBK字符集),需要将原utf8字符集(4.1之前的默认字符集)数据库转换为gbk字符集。

  在/usr/local/mysql/bin/mysql通过命令方式下,或者使用2.6.2以上版本的phpMyAdmin建立一个新的GBK字符集数据库,再使用phpMyAdmin导出脚本功能,导出表结构的脚本,会发现库脚本中指定字符集DEFAULT CHARSET=utf8。

CREATE TABLE MyTable  (
  ……
  (字段定义)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

将表结构脚本中 utf8 替换为 gbk,如下:
CREATE TABLE MyTable  (
  ……
  (字段定义)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

  利用改了字符集的表结构在新的GBK字符集数据库中建立相应表,于是您就拥有了与原utf8字符集数据库结构完全一直的gbk数据库。

  或者更简单的方法,直接使用phpMyAdmin2.6.2复制一个相同的数据库(只复制结构,不复制数据),再使用phpMyAdmin2.6.2的“操作”功能,将新的数据库和表的字符集都转换为gbk。

  剩下的工作就是需要将原utf8字符集数据库中的数据导入到新的GBK字符据数据库中。这个工作可以用一个php小程序来完成。

  假定原utf8字符集的数据库名:db_utf8,新的gbk字符集的数据库名:db_gbk,php程序调用方式:togbk.php?tab=MyTable,转换表MyTable的数据。<?
  set_time_limit(3600);

  if(!$tab){
    echo "没有指定表名称 tab=????";
    exit;
  }

  $server_gbk =mysql_connect('localhost','root','password');
  mysql_select_db('db_ gbk',$server_gbk);
  mysql_query("SET NAMES gbk",$server_gbk);

  $server_utf8 =mysql_connect('localhost','root','password');
  mysql_select_db('db_utf8',$server_utf8);
  mysql_query("SET NAMES utf8",$server_utf8);

  $rpp = 2500;

  $sql = "select count(1) from $tab";
  $rst = mysql_query($sql,$server_utf8) or die('数据查询出错');
  $row = mysql_fetch_array($rst);
  mysql_free_result($rst) or die("无法清除换缓存?");
  $rws = $row[0];
  $tpg = ceil($rws/$rpp);
  echo "原表一共 $rws 条记录,分 $tpg 批处理<br>;";
  flush();
  
  for($p=0;$p<$tpg;$p++){
    $sql = "select * from $tab limit " . $p*$rpp . "," . $rpp;
    $rst = mysql_query($sql,$server_utf8) or die('数据查询出错');
    $num = mysql_num_fields($rst);
    while($row=mysql_fetch_array($rst)){
      $sql = "insert into $tab values(";
      for($i=0;$i<$num;$i++){
              if($i==0)
                $sql.=" '" . addslashes($row[$i]) . "'";
              else
                $sql.=",'" . addslashes($row[$i]) . "'";
      }
      $sql.=");";

      mysql_select_db('db_gbk',$server_gbk);
      mysql_query("SET NAMES gbk",$server_gbk);
      if(!mysql_query($sql,$server_gbk)) echo $sql . mysql_error() . "<br>;";
      mysql_select_db('db_utf8',$server_utf8);
      mysql_query("SET NAMES utf8",$server_utf8);
    }
    mysql_free_result($rst) or die("无法清除?");
    echo "第 " . ($p+1) . " 批完成<br>;";
    flush();
  }

  mysql_close($server_utf8)    or die("无法与服务器断开连接!");
  mysql_close($server_gbk)    or die("无法与服务器断开连接!");
?>;

« 上一篇 | 下一篇 »

Trackbacks

点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5

Leave a Comment

评论内容 (必填):