您的位置: 首页 / Experiences / Movable Type 迁移乱码问题的解决

Movable Type 迁移乱码问题的解决

Published at Sep 13, 12am / Keywords: , , , ,

飞猪这两天被博客搬家的事情搞得坐卧不安,他的博客平台为 Movable Type,新的虚拟主机选择的是 Bluehost 的虚拟主机,也因此碰到了一个很常见,很麻烦的问题——乱码。今天帮他解决了这个问题,丫很高兴,非让我写个“通俗易懂”的教程造福全人类,那我就写的尽量通俗一点好了。

适用条件:原来的数据库为 MySQL 3.X 或 4.0.X(比如飞猪原来用的玛雅网络),迁移到的数据库为 MySQL 4.1.X 及以上版本。

具体步骤:

  1. 在原来的主机(Mysql 3.x/4.0.x)上使用 phpMyAdmin 导出数据,导出时要注意先点击左侧被导出的数据库,然后点击右侧上方的 Export,选中所有的表,导出即可。
  2. 在新主机(MySQL 4.1.x or higher)上使用 phpMyAdmin 建立一个数据库(或者使用虚拟主机的面板建立也可以),然后在 phpMyAdmin 中打开这个数据库(左侧点击数据库名),点击右侧的 Operations,然后将下方的 Collection 更改为 utf8-general-ci。
  3. 点击 Import,将第一步导出的数据导入数据库。
  4. 找到 /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;
    }

好了,乱码问题应该没有了。Enjoy!

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

其实问题主要出在 MySQL 上。MySQL 自从 4.1 版开始,添加了字符集支持。MySQL 在存取数据的时候,会对字符集进行转换。而 MySQL 之前的版本没有这个特性,升级的时候,MySQL 4.1 会将他们统统认为 latin1-swedish-ci。而像 MT, WordPress 那样使用 UTF-8 编码存储的程序在这里就会出问题了。

解决这个问题,有个取巧的办法。因为 MySQL 3.X 因为没有这个特性,当我们导出 MySQL 数据表时并不包含字符集设置的信息。在导入 MySQL 4.1.x 之前,我们首先将数据库默认的字符集设定为 UTF-8,再导入,字符集就正确了。

修改 MT 那个文件,就是为了让 MT 能够按照正确的字符集来读写 MySQL。SET NAMES ‘UTF8’ 这条命令就是将输入输出字符均设置为 UTF-8,由此便解决了乱码问题。

本文参考了这篇文章,这篇文章的方法在两个 MySQL 4.1.x 数据库之间迁移时,并且可以使用 Shell 的情况下会非常好用。如果您属于这种情况,可以参考一下。

本文所讲述的方法在 Flypig 的博客上验证通过。

发表您的观点或推荐本文 Loading...