MovableType 的历史编码问题

最近刚刚把网站迁移到新的 VPS,还是放在 DigitalOcean,但是系统已经是全新的 Ubuntu 20.04 LTS。

迁移 Blog 需要把数据库备份,然后导入到新的服务器上的数据库中后才行。

本Blog 用的是 MovableType,从 2004 年开始建立的,当时采用的是 MT 3.11。中间迁移过好多次,每次导出的数据,看上去都是乱码,而且如果用 phpmyadmin 之类的工具查看数据的话,也是乱码。但是导入之后,从 MT 后台看到的还是正确的,可以正常地使用,所以就一直没有怎么去管它。

这次确实出现了导入后, 在 MovableType 后台看到的还是乱码,当然如果直接发布,就会全部是乱码的文字了,不知如何解决。

于是外事不决问 Google,一番搜索之后,找到下面这段,看着很类似我现在的问题。

Movable Type 5 默认使用的编码是 UTF-8,但是数据库连接中却优先使用当前数据库的 DEFAULT CHARSET 设置。如果在建立数据库的时候,DEFAULT CHARSET = utf8 那不会出什么问题,但如果设置是 DEFAULT CHARSET = latin1 就会出现一些问题,不巧的是,很多 MySQL 数据库的默认编码设置就是 latin1。

如果数据库的默认编码是 latin1,Movable Type 仍然会按照 UTF-8 编码保存数据,而数据库则用 latin1 编码保存和识别信息,在 Movable Type 界面中显示数据都是正常的,但是在需要导出或备份数据库的时候就会出现乱码了,比如用 phpMyAdmin 查看这些数据库中表里的记录,发现中文全部是乱码,导出后的文件也是乱码。

如何把这些乱码转换成正确的字呢?可以尝试下面的方法。

如果数据库的名字是 db_name,使用下面的导出命令:

mysqldump -uroot -p --default_character-set=latin1 --skip-set-charset db_name > db.sql

输入密码后产生 db.sql 文件,替换文件中的 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci 为 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 以及替换 collate latin1_general_ci 为 collate utf8_unicode_ci,之后新建一个数据库,注意设置 DEFAULT CHARSET = utf8,在这个数据库中执行导出的 SQL 就可以将这些"乱码"转换为正常的字了。

实际操作时,我是这样做的。

先用上面的 mysqldump 命令把数据库导出到一个 sql 文件,(这时导出的 sql 文件内容已经没有乱码了。显示中文正常。)然后用 Notepad++ 打开 sql 文件,寻找 DEFAULT CHARSET=latin1 字符串,替换为 DEFAULT CHARSET=utf8

保存之后,现在的 MySQL数据库,新建的数据库默认就是 utb8mb4_general_ci,就直接导入到数据库中就可以了。

这样就把 MovableType一直以来的历史问题,编码问题就解决了。

其实还有一个问题,就是数据库太大了,用 notepad++ 打开,会出现问题。

于是在旧数据库,导出之前,先清理了 mt_log 表,这个表就是在 MT 后台,可以看到的 Activity Log 的内容,里面记录了大量的内容,因为使用的时间太久,表中数据太多,而我又没有用到,可以安全去掉。

这个表里面记录的活动日志分五级

  • INFO / 1
  • WARNING / 2
  • ERROR / 4
  • SECURITY / 8
  • DEBUG / 16

这个表大概有 50MB,清掉之后就可以了。



作者: David Yin
原载: Free Thinking
版权所有。转载时必须以链接形式注明作者和及本声明。
blog comments powered by Disqus