您的位置: 首页 / 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),按照下面的提示修改:
    1. sub init {
    2.     my $driver = shift;
    3.     $driver->SUPER::init(@_);
    4.     my $cfg = $driver->cfg;
    5.     my $dsn = 'dbi:mysql:database=' . $cfg->Database;
    6.     $dsn .= ';hostname=' . $cfg->DBHost if $cfg->DBHost;
    7.     $dsn .= ';mysql_socket=' . $cfg->DBSocket if $cfg->DBSocket;
    8.     $dsn .= ';port=' . $cfg->DBPort if $cfg->DBPort;
    9.     $driver->{dbh} = DBI->connect($dsn, $cfg->DBUser, $cfg->DBPassword,
    10.         { RaiseError => 0, PrintError => 0 })
    11.         or return $driver->error(MT->translate("Connection error: [_1]",
    12.              $DBI::errstr));
    13.     $driver->{dbh}->do("SET NAMES 'utf8'"); // 添加这一行
    14.     $driver;
    15. }

好了,乱码问题应该没有了。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...

8 Responses

  1. flypig
    Sep 13, 1am / LINK / REPLY
    Gravatar

    老大,请问一下trackback在哪里?

  2. Sep 13, 8am / LINK / REPLY
    Gravatar

    在url的后面加上/trackback/就是wordpress架设的blog的trackback了

  3. Sep 13, 8am / LINK / REPLY
    Gravatar

    to flypig:我开自动发掘了,你就直接引用我的文章地址也可以 trackback.
    to shunz: 呵呵,没错。

  4. yet
    Sep 13, 2pm / LINK / REPLY
    Gravatar

    能不能把WORDPRESS出现这样的问题的解决方法也说一下,好吗??我也是迁移数据,出问题,是WORDPRESS从MySQL 4.0.21迁到4.1的,55…求助!

  5. Sep 13, 8pm / LINK / REPLY
    Gravatar

    to yet: WordPress 的可以看看这篇文章

  6. jimmy
    Sep 14, 11pm / LINK / REPLY
    Gravatar

    你好,你的WORDPRESS主题很酷,可以发给我一份吗?
    谢谢 :smile:

  7. Sep 15, 2pm / LINK / REPLY
    Gravatar

    4.1后的mysql支持直接用alter table 转换表的字符集 如:
    ALTER TABLE table CONVERT TO CHARACTER SET UTF8;

Now, It's your Turn!

BACK TO Article / Comments