Movable Type 迁移乱码问题的解决
飞猪这两天被博客搬家的事情搞得坐卧不安,他的博客平台为 Movable Type,新的虚拟主机选择的是 Bluehost 的虚拟主机,也因此碰到了一个很常见,很麻烦的问题——乱码。今天帮他解决了这个问题,丫很高兴,非让我写个“通俗易懂”的教程造福全人类,那我就写的尽量通俗一点好了。
适用条件:原来的数据库为 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;
- }
好了,乱码问题应该没有了。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 的博客上验证通过。
原文链接**:花儿开了 - Movable Type 迁移乱码问题的解决
** 本博客文章全部原创,原则上不欢迎全文转载,如需转载(包括部分转载,使用文章图片等)请务必标注原文链接!同时,本博文章不欢迎任何形式的派生及篡改,如需引用,请使用引用通告(Trackback) - http://blog.istef.info/2006/09/13/the-solution.../trackback/。商业网站使用请务必先取得作者授权!

老大,请问一下trackback在哪里?
在url的后面加上/trackback/就是wordpress架设的blog的trackback了
to flypig:我开自动发掘了,你就直接引用我的文章地址也可以 trackback.
to shunz: 呵呵,没错。
能不能把WORDPRESS出现这样的问题的解决方法也说一下,好吗??我也是迁移数据,出问题,是WORDPRESS从MySQL 4.0.21迁到4.1的,55…求助!
to yet: WordPress 的可以看看这篇文章
你好,你的WORDPRESS主题很酷,可以发给我一份吗?
谢谢
4.1后的mysql支持直接用alter table 转换表的字符集 如:
ALTER TABLE
tableCONVERT TO CHARACTER SET UTF8;