完成想了一年多的问题

之前运行在mysql4.1.22的网站,程序编码是gb2312,数据库是utf8,于是库里的内容完全乱码。使用各种工具导出,phpmyadmin修改各种编码都无效。终于最近必须迁移到mysql5找出了办法。

原环境:

Apache1.3.41
PHP4.4.9
Mysql4.1.22 字符集utf8,连接校对utf8_general_ci,数据库 latin1,数据表latin1
网站 gb2312

新环境

Apache2.2.21 PHP5.3.8 Mysql5.5.16

1.数据导出

根据一些文章的说法,使用mysqldump 各种 set names无效;使用Mysql GUI Tools无效。导出后的sql文件中文乱码。考虑一个思路,既然gb2312的网站能够正常显示,那么使用网站代码进行库的导出就不会乱码。

参考此文http://huangdekai1.blog.163.com/blog/static/3057141620114110716677/,因为不想用命令行,所以略加修改

<?php

$database = “”;

$options = array(

‘hostname’ => ‘localhost’,

‘charset’ => ”,

‘filename’ => ‘xx.sql’,

‘username’ => ”,

);

$options[‘password’] = “”;

mysql_connect($options[‘hostname’], $options[‘username’], $options[‘password’]);

mysql_select_db($database);

//mysql_query(“SET NAMES ‘{$options[‘charset’]}'”);

// 设置要导出的表

$tables = list_tables($database);

$filename = sprintf($options[‘filename’], $database);

$fp = fopen($filename, ‘w’);

foreach ($tables as $table) {

dump_table($table, $fp);

}

fclose($fp);

mysql_close();

echo “done.\n”;

exit;

function list_tables($database)

{

$rs = mysql_list_tables($database);

$tables = array();

while ($row = mysql_fetch_row($rs)) {

$tables[] = $row[0];

}

mysql_free_result($rs);

return $tables;

}

function dump_table($table, $fp = null)

{

$need_close = false;

if (is_null($fp)) {

$fp = fopen($table . ‘.sql’, ‘w’);

$need_close = true;

}

fwrite($fp, “– \n– {$table}\n– \n”);

$rs = mysql_query(“SELECT * FROM `{$table}`”);

while ($row = mysql_fetch_row($rs)) {

fwrite($fp, get_insert_sql($table, $row));

}

mysql_free_result($rs);

if ($need_close) {

fclose($fp);

}

fwrite($fp, “\n\n”);

}

function get_insert_sql($table, $row)

{

$sql = “INSERT INTO `{$table}` VALUES (“;

$values = array();

foreach ($row as $value) {

$values[] = “‘” . mysql_real_escape_string($value) . “‘”;

}

$sql .= implode(‘, ‘, $values) . “);\n”;

return $sql;

}

?>

注意这行代码

//mysql_query(“SET NAMES ‘{$options[‘charset’]}'”);

这里设置了gbk和utf8都会导致乱码,注释掉反而能正常导出中文。导出后使用editplus另存为utf8格式。

2.建立数据库

由于上面导出的只有insert语句的数据,使用phpmyadmin将原结构导出,修改导出后的sql中的latin1为utf8,执行sql新建库。此时库和表编码都是utf8了。

3.导入数据

第1步导出的数据可能很大。所以使用Mysql Gui Tools导入。这里直接用“恢复”是不行的,要用Tools里面的Mysql查询浏览器,文件->打开脚本。执行中如果有哪个insert语句出错,可以在脚本窗口直接修改后执行。

4.程序格式转换

经过以上步骤,数据就转换为utf8格式。但是网站程序依然是gb2312,此时需要两个步骤:首先用gb2utf8将所有html和php文件转为utf8,注意要把已经是utf8的文件排除,否则转换后会产生乱码;然后用search&replace将所有header里面的chartset改为utf8.

转换全部完成。

《完成想了一年多的问题》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注