免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1674 | 回复: 0
打印 上一主题 下一主题

原LATIN1数据库导入GBK字符集数据库的PHP小程序源代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-12 10:48 |只看该作者 |倒序浏览
题外话:Mysql版本4.1.12,我用phpMyAdmin2.6.2可以正常显示gbk字符集表中的内容,却不能正常显示原latin1字符集表中的内容(乱码)。用phpMyAdmin2.2.2就刚好相反,可以正常显示原latin1字符集表中的内容,却不能正常显示gbk字符集表中的内容(乱码)。所以只好两个版本都装了。

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

正 文:

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

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

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

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

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

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

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

  假定原latin1字符集的数据库名:db_latin1,新的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_latin1 =mysql_connect('localhost','root','password');
  mysql_select_db('db_latin1',$server_latin1);
  mysql_query("SET NAMES latin1",$server_latin1);

  $rpp = 2500;

  $sql = "select count(1) from $tab";
  $rst = mysql_query($sql,$server_latin1) 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_latin1) 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_latin1',$server_latin1);
      mysql_query("SET NAMES latin1",$server_latin1);
    }
    mysql_free_result($rst) or die("无法清除?";
    echo "第 " . ($p+1) . " 批完成<br>;";
    flush();
  }

  mysql_close($server_latin1)    or die("无法与服务器断开连接!";
  mysql_close($server_gbk)    or die("无法与服务器断开连接!";
?>;
<br>;
全部完成啦?[/code][/quote]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP