- 论坛徽章:
- 0
|
题外话: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] |
|