适用条件:原来的数据库为 MySQL 3.X 或 4.0.X(比如飞猪原来用的玛雅网络),迁移到的数据库为 MySQL 4.1.X 及以上版本。
具体步骤:
在原来的主机(Mysql 3.x/4.0.x)上使用 phpMyAdmin 导出数据,导出时要注意先点击左侧被导出的数据库,然后点击右侧上方的 Export,选中所有的表,导出即可。
在新主机(MySQL 4.1.x or higher)上使用 phpMyAdmin 建立一个数据库(或者使用虚拟主机的面板建立也可以),然后在 phpMyAdmin 中打开这个数据库(左侧点击数据库名),点击右侧的 Operations,然后将下方的 Collection 更改为 utf8-general-ci。
点击 Import,将第一步导出的数据导入数据库。
找到 /lib/MT/ObjectDriver/DBI/mysql.pm,找到这样一段(修改位置在 99 行,MT 3.2),按照下面的提示修改:
在新主机(MySQL 4.1.x or higher)上使用 phpMyAdmin 建立一个数据库(或者使用虚拟主机的面板建立也可以),然后在 phpMyAdmin 中打开这个数据库(左侧点击数据库名),点击右侧的 Operations,然后将下方的 Collection 更改为 utf8-general-ci。
点击 Import,将第一步导出的数据导入数据库。
找到 /lib/MT/ObjectDriver/DBI/mysql.pm,找到这样一段(修改位置在 99 行,MT 3.2),按照下面的提示修改:
sub init {
my $driver = shift;
$driver->SUPER::init(@_);
my $cfg = $driver->cfg;
my $dsn = ‘dbi:mysql:database=’ . $cfg->Database;
$dsn .= ‘;hostname=’ . $cfg->DBHost if $cfg->DBHost;
$dsn .= ‘;mysql_socket=’ . $cfg->DBSocket if $cfg->DBSocket;
$dsn .= ‘;port=’ . $cfg->DBPort if $cfg->DBPort;
$driver->{dbh} = DBI->connect($dsn, $cfg->DBUser, $cfg->DBPassword,
{ RaiseError => 0, PrintError => 0 })
or return $driver->error(MT->translate("Connection error: [_1]",
$DBI::errstr));
$driver->{dbh}->do("SET NAMES ‘utf8’"); // 添加这一行
$driver;
}
my $driver = shift;
$driver->SUPER::init(@_);
my $cfg = $driver->cfg;
my $dsn = ‘dbi:mysql:database=’ . $cfg->Database;
$dsn .= ‘;hostname=’ . $cfg->DBHost if $cfg->DBHost;
$dsn .= ‘;mysql_socket=’ . $cfg->DBSocket if $cfg->DBSocket;
$dsn .= ‘;port=’ . $cfg->DBPort if $cfg->DBPort;
$driver->{dbh} = DBI->connect($dsn, $cfg->DBUser, $cfg->DBPassword,
{ RaiseError => 0, PrintError => 0 })
or return $driver->error(MT->translate("Connection error: [_1]",
$DBI::errstr));
$driver->{dbh}->do("SET NAMES ‘utf8’"); // 添加这一行
$driver;
}
其实问题主要出在 MySQL 上。MySQL 自从 4.1 版开始,添加了字符集支持。MySQL 在存取数据的时候,会对字符集进行转换。而 MySQL 之前的版本没有这个特性,升级的时候,MySQL 4.1 会将他们统统认为 utf8-swedish-ci。而像 MT, WordPress 那样使用 UTF-8 编码存储的程序在这里就会出问题了。
解决这个问题,有个取巧的办法。因为 MySQL 3.X 因为没有这个特性,当我们导出 MySQL 数据表时并不包含字符集设置的信息。在导入 MySQL 4.1.x 之前,我们首先将数据库默认的字符集设定为 UTF-8,再导入,字符集就正确了。
修改 MT 那个文件,就是为了让 MT 能够按照正确的字符集来读写 MySQL。SET NAMES ‘UTF8′ 这条命令就是将输入输出字符均设置为 UTF-8,由此便解决了乱码问题。
同时参考这篇文章:http://www.kingda.org/archives/kingda/2006/04/mt32_1.html