牛哥
一年好景君须记,最是橙黄橘绿时
牛哥

春节过后,突然有一天发现自己的博客页面竟然全都打不开了,显示“内容编码错误”,登录主机后又发现部分文件竟然神秘丢失了(备份文件夹被清空了,貌似主机商进行了机房的物理迁移)。几经搜索和试验,我发现原因可能是主机搬迁后“Gzip压缩”功能被关闭了(尽管客服再三肯定此功能是打开的),而我进入phpmyadmin后台将博客“Gzip压缩”选项关闭后,网站可以正常访问,但总感觉比以前的响应要慢很多,不知是不是心理作用。

我手动拷贝到本地的备份文件最近的版本是2019年1月25日,当我将备份文件还原后又发现网站所有的设置和插件设置竟然全都恢复为初始值了,实在懒得再去挨个设置一遍,加之zblog用了这么久也早看腻歪了,于是决定转投typecho阵营。

可是在网上找了好久,也没有发现一种可以将zblog完美转换typecho的工具或方法,有的说可以先将zblog转WordPress、再由WordPress转typecho,但那样实在太折腾了,还不能确定是否能完美转换。几百篇文章,手动复制粘贴的工程量实在太大了,另外评论也没有办法复制。

忽然想到以前重装博客系统的步骤,先安装一个全新的系统,然后将先前备份的sql数据库从phpmyadmin导入进去,于是我想zblog转typecho或许也能从数据库上想想办法。昨天折腾了一下午,还真让我试验成功了,之前所有的zblog数据全部完美转换至typecho,现将转换方法在此做个备忘,有需要的朋友可以参考一下。

1、熟悉一下zblog和typecho的几个数据表。

首先进入phpmyadmin平台,看看zblog和typecho数据表的不同之处。

我们需要转换的数据表有以下几个:

zbp_category、zbp_tag =>> typecho_metas (分类、标签)

zbp_post =>> typecho_contents(文章、独立页面)

zbp_comment =>> typecho_comments(评论)

zbp_post =>> typecho_relationships(文章关联的分类和标签)

在上述几个表内,尽管字段名有所不同,但性质基本是一样的,自己对照看一下就明白了。

2、zblog数据表字段处理

typecho几个数据表的字段名和排序如下:

typecho-metas(分类、标签)
typecho-metas

typecho-contents(文章)
typecho-contents

typecho-comments(评论)
typecho-comments

对zblog的数据表字段名和排序进行处理,使之与typecho的字段名和排序一一对应。多出的字段可以先排在最后面(尽量先不要删除任何字段),若缺少的字段可以新增,如zbp_post数据表中没有modified(最后修改日期),就可以在“创建日期”后面新增一个字段,然后将“创建日期”的内容复制至“modified”字段内。

3、数据表导出、处理

分别将前述8个数据表以XML格式导出,并复制一份至其他文件夹备份(以防止数据转换出错)。

使用notepad软件对zblog各个数据表进行编辑,将数据表名、字段名全部替换为typecho相应的内容,然后将其复制至typecho对应数据表内(仅复制标签内容,相同
条目覆盖即可,其他内容不作改动)。

三个需要注意的地方

① 在zblog中,文章分类和标签分别记录在zbp_category、zbp_tag两个表内,而typecho是放在同一个表内的,所以需要将处理过的zbp_category、zbp_tag两个表的内容复制到typecho_metas表中。

② 在zblog的zbp_post内有log_CateID、log_Tag两个字段(即分类id和标签id),而在typecho_contents内是没有这两个字段的。在typecho系统中文章与分类和标签的关联都是体现在typecho_relationships数据表中的,在typecho_relationships中每一行数据表示一种归属关系,不管分类或是标签都是一行,对应id为typecho_metas中的内容。所以需要将zbp_post中的log_CateID、log_Tag两个字段内容都复制至typecho_relationships数据表中,仅保留cid和mid两个字段即可。

③ 在zblog中若某篇文章有多个标签,则在zbp_post对应的某行数据的log_Tag字段中会存在多个以{}符号分隔的标签id,此时如果需要保留全部标签,就需要手动将多个标签id分拆为多条记录并添加至typecho_relationships数据表中。在这个事情上我就偷了个懒,每篇文章仅仅保留了一个标签id,其他全部清除了。

4、数据表导入

在phpmyadmin中将typecho系统的typecho_metas、typecho_contents、typecho_comments、typecho_relationships四个数据表删除,再将本地修改好的四个typecho数据表导入系统,若执行命令后未报错即为成功,否则应根据错误信息检查、修改XML文件内容,一般会因为存在多条相同记录而报错。

5、最后优化

经过上述处理,zblog数据转换typecho基本就大功告成了。

在前台随便打开几遍文章,看看是否存在其他显示问题。由于zblog一般采用html代码编辑文章,而typecho采用的是markdown模式编辑,所以在数据转换后可能会在文章页面留下一些html代码(一般是由于zbog发表文章时采用了非默认的style样式),使用SQL命令进行批量替换即可。

需要用到的几个小诀窍:

① SQL命令:数据表字段内容的复制

update 表名 set Column_Name1=Column_Name;
(将字段name的内容复制至name1)

② SQL命令:字符替换

update 表名 set Column_Name=replace(Column_Name,'text','text1')
(用“text1”替换“text”,若text1改为空值即为查找text并删除)

③ Notepad“正则表达式”查找模式

(.*) 表示任意长度的任意字符,类似于word查找中的通配符 *

\r 表示换行符

notepad-find

④ 有个PostsCategoryChange的插件很好用,可以批量更改文章分类、状态(公开|隐藏|私密),最后可根据需要做最终优化调整。但每篇文章必须关联且仅能关联一个分类id,否则更改文章分类时插件会提示操作失败。

2019年04月07日