Movable Type迁移乱码问题的解决

在更换空间后,出现了乱码问题。这里是写的乱码问题的解决方法。

适用条件:原来的数据库为 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),按照下面的提示修改:
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;
}

下面简单讲讲原理,不想看的略过就好了,呵呵

其实问题主要出在 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

Leave a Reply

Your email address will not be published.