如何从SQL备份读取旧MediaWiki(1.16版本)页面文本?
提取旧MediaWiki(1.16版本)SQL备份中的页面内容
你的猜测完全正确!MediaWiki 1.16版本确实把页面核心内容存在text表中,你看到的二进制编码其实是因为内容默认做了gzip压缩处理,所以直接读取会显示乱码。我之前处理过类似的旧Wiki备份,下面给你一步步拆解怎么提取出可读内容:
第一步:定位目标页面对应的内容ID
MediaWiki的page表记录了所有页面的基本信息,其中page_latest字段关联着text表的old_id(也就是当前版本页面内容的唯一标识)。你可以用SQL先找到目标页面的这个关联ID:
-- 替换成实际页面标题,注意标题里的空格会被存成英文下划线,比如"我的技术笔记"要写成"My_Tech_Notes" SELECT page_id, page_latest, page_title FROM page WHERE page_title = '你的页面标题';
如果记不清完整标题,用模糊查询缩小范围:
SELECT page_title, page_latest FROM page WHERE page_title LIKE '%关键词%';
第二步:解压并读取二进制内容
拿到page_latest对应的old_id后,就可以去text表提取内容了,分两种情况:
- 如果内容是gzip压缩的:查看
text表的old_flags字段,要是包含g标记,就用MySQL的UNCOMPRESS()函数解压:SELECT UNCOMPRESS(old_text) AS page_content FROM text WHERE old_id = '你查到的old_id值'; - 如果没有压缩:如果
old_flags里没有g,直接把二进制数据转成字符串即可:SELECT CAST(old_text AS CHAR) AS page_content FROM text WHERE old_id = '你查到的old_id值';
批量提取小技巧
要是你需要一次性提取多个页面的内容,可以直接关联page和text表查询:
SELECT p.page_title, UNCOMPRESS(t.old_text) AS page_content FROM page p JOIN text t ON p.page_latest = t.old_id WHERE p.page_title IN ('页面标题1', '页面标题2', '页面标题3'); -- 替换成你需要的页面标题列表
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

