之前运行在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.
转换全部完成。
导入也可以用mysql -uroot -p –default-character-set=utf8 dbname