DIARIO DE CHINOS 华侨快报(国际刊号 ISSN 2530-1349) 新手帮助

西班牙华人网-华侨快报

电脑爱好电脑爱好
关注: 0贴子:195 排名: 55 
0 回复贴,33 次查看
<返回列表

Discuz! 从 GBK 转换 UTF-8 编码全过程

网友
网友  发表于 2017-7-27 19:57:51
在 Discuz! 诞生之时,国内网站清一色以 GBK 编码为主流,很多老站长都选择了以在当时很成熟的 GBK 编码来建站。如今过了十几个年头,Unicode 已经成功统治了世界,如何把 Discuz! 从 GBK 转换到 UTF-8 成了困扰很多老论坛的难题。  B7 U7 c; p/ t8 W3 |
+ l3 D8 e# Z% `
SteamCN 论坛如今已经拥有十三年的历史,经历了 dvbbs、Discuz!、Discuz! X 三个阶段,是国内为数不多能完好保存十多年前附件和图片的论坛。今天在短短两小时的维护时间内,SteamCN 论坛成功从 GBK 编码完美转换到了 UTF-8(utf8mb4,支持 emoji &#128536;)。本文将记录转换所用的工具、脚本以及常见的坑,以供广大 Discuz! 站长参考。" o. n: y2 [7 f/ r* Z
: n8 I  i0 ?* G1 w+ B+ a0 _
本次转换工作得到了 DxGit Forker 群内 Coxxsgreenrock[微凡] 的帮助,非常感谢二位的指导!

" m8 s, b$ Q: g- g9 {  ]  D2 }/ [6 h2 Q& h
1. 准备工作3 r0 }! E  D1 d. P$ M1 ~
, \# i( l9 }: c8 L8 W
不同的网站都有自己的不同之处,请务必先在测试环境内演练转换过程,然后再应用到线上正式服务器。
/ u) Y9 r; D! \* E
7 ?  A- [& T* m6 ?, s0 u1. 下载与自己当前 Discuz! 版本号相同的 UTF-8 安装包。本站为经过浅度定制的 Discuz! X3.3,以下教程以 Discuz! X3.3 为例来进行。如果你的网站经过深度定制,请人工将代码转换为 UTF-8 编码。& R8 K9 A( g# ]0 a1 u
2. 准备测试数据库。将当前线上版本数据库完整拷贝一份作为测试数据库,我们将先以该数据库进行一次演练。
! f+ W6 v& f3 m: z1 N% h3. 准备测试用 Web 服务器。将网站文件夹拷贝一份到测试 Web 服务器上。由于 data、uc_client/data、uc_server/data/avatar 这几个目录体积会比较大,可以忽略它们。5 y4 F5 f6 T6 i( d) D
4. 编辑测试环境中的 config/config_global.php、config/config_ucenter.php、uc_server/data/config.inc.php,将数据库配置为测试数据库,并关闭 Discuz! 的一切内存缓存功能。
' [1 Y5 K' `; v6 U) v! _5. 确认测试环境的网站可以正常运行。
# a3 U1 y+ ^8 r" z# f' j5 d' Q5 _3 y' g: }8 Q* f% {+ N8 S
2. 转换数据库5 d, U  s9 n& f* I/ i( ]. \& g
  i: c( V0 O" o3 C2 I( u6 z
我们需要人工手动使用这条语句对数据库中的每一个表进行转换:, |$ v" I' a8 y6 s3 H7 }6 V
  • ALTER TABLE `表名` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    / B6 A% n( T5 c
4 n/ w% U( ~. d" n+ n3 p+ v2 ^% a6 _- C
[color=rgb(87, 186, 232) !important]复制代码
. i0 ]. z3 n8 E, [5 r% x# U
- ~. e4 N( V! ^; y! Q7 a

3 Z# l* u& y& z# p务必将运行过的每一个语句记录下来中,方便最后在线上服务器部署。
: v& l1 f0 Y0 \% w+ ~0 U: _
; `- A' Z: w: Q( e可能会遇到的问题:' A. C- w2 y5 F+ T
9 r. l3 f& w+ G
Q: 为什么这里不提供预先编写好的 SQL 呢?
8 M  h+ A3 N5 d  v2 |A: 因为每个网站的数据库差异很大,我们使用的 SQL 脚本(文末附件压缩包内 gbk-to-utf8mb4.sql)未必适合你的网站。这里需要人工对每一个数据表运行这个语句。0 r4 S3 i" W5 u( T  S& a: `) r# G

4 N! I9 m* {) D2 p6 @Q: 提示索引最大长度为 xxx,转换失败% U* D5 d; ^2 I. ^! U
A: 调整索引涉及到的字段长度,保证不超过 xxx / 4。例如 pre_common_addon 这个表报错索引长度最大不能超过 1000,那么需要将 key 字段的类型从 varchar(255) 改为 varchar(200)。
& j: a2 u5 f: N* H' P
5 C3 |: }7 l: p7 c8 y3 d2 z) a: NQ: 提示用户名重复,转换失败! }/ i9 z$ m9 k5 B+ m1 F/ @3 l
A: 这是由于一些字符在 gbk_chinese_ci 排序规则下认为是不同的,但是在 utf8mb4_unicode_ci 排序规则下认为是相等的。例如全角英文字母与半角英文字母,在 gbk_chinene_ci 下认为 A != A,但是在 utf8mb4_unicode_ci 下认为 A == A。这时需要编辑 unique 索引,改为普通索引,然后重新转换,再将索引改回 unique 类型,此时会具体指出哪个用户名重复,请记录其 UID。如果数据量比较大,可以自行编写 SQL 寻找重复项。# P/ ?4 X7 M0 D- E* G3 p
对于重复的用户名,我们可以使用这个语句将该用户的用户名重置为 email:
7 A8 s+ ?8 }3 u  N' y$ Q5 D
  • UPDATE `表名` SET `username` = email WHERE `表名`.`uid` = 上面记录的用户UID;1 H4 Q# c- Y. K7 _0 `9 ]' s! u* ^
/ Q9 |' K! J8 L6 L3 ~1 x( D
[color=rgb(87, 186, 232) !important]复制代码

! O7 W+ N+ m  g% k5 Z; D. u) f' h, z; e3 c

3 A) ?) z' D7 A- E% v# y3. 上传 UTF-8 版本代码! Q7 V# |  E  i. C* i) j% s+ |; X: Z
6 H. H4 h: D) z0 H- B
将准备阶段取得的 UTF-8 版本代码覆盖到测试服务器中(注意不要覆盖掉 config 文件)。* K  P) {4 M& p  I. E6 p) u
编辑 config/config_global.php、config/config_ucenter.php、uc_server/data/config.inc.php,将其中 DBCHARSET 改为 utf8mb4,输出 CHARSET 改为 utf-8。
4 J2 }4 a. g' x5 B( Y到此先不要打开网站测试效果!
6 v" n% i+ O8 y' p  r$ J. D9 G! |: s3 U2 A) K* @) }' @+ d
4. 修复数据库
7 h3 d% Z9 v, V
# M- U/ E5 k2 l' ?& Y/ l3 w由于 Discuz! 大量使用了 PHP 的 serialize 方法来序列化对象存入数据库,而 serialize 方法序列化出来的结果和编码是相关的,因此需要修复数据库中以前使用 GBK 编码序列化的结果,使其能在 UTF-8 编码下反序列化出来。
3 C( m# H* N9 L' W# T/ j' @" r* M6 d7 W+ C
扩展阅读
2 n' W0 S0 x0 I/ {) c. A/ R3 m8 V/ c  B
下载文末附件“脚本与工具.zip”,解压出来得到 migrate_db.php(出处,略做修改),编辑该文件结尾的数据表列表,确认这些表和字段都是在你数据库存在的。这个列表未必完善,建议手动检查一遍所有数据表,补充可能漏掉的数据表和字段。第 29 行指定了单次处理的数据条数,如果你的数据库性能比较差,建议降低该值。$ j4 |. n* S) p; u) V5 F

0 c7 K' {6 N$ G. h% @8 P将 migrate_db.php 上传到网站根目录,浏览器访问它,点击“Discuz! 序列化整理”开始修复。
% |+ H8 `. t: _7 O4 n8 \7 A: J% z! M: K) [( _1 [& J7 T& v
5. 转换模板、插件编码, t- f( X1 w1 d. Z

6 U4 }- ^, A7 U人工将你所有使用的模板、插件的编码转换为 UTF-8。注意不要漏掉 XML 文件。/ d) s1 H1 F* [2 w! x! F0 B6 P
如果你的模板、插件是从应用商店下载的,没有经过改动,建议登录后台进行卸载,在应用中心重新安装一遍。
) \; C6 F/ C- a' I- o! q  e  R" M, E1 g1 T, ^4 s4 |! A2 r6 E; }
6. 转换日志编码
: s$ C1 q& E5 u3 ]) ], W
' T8 C- U. e5 I8 N8 D3 dDiscuz! 将运行日志记录在了 data/logs 目录下,如果你在准备阶段没有将这个目录复制到测试环境,可以在最终部署时再进行。
/ X/ ~* D; a. }9 {将该目录下的每个文件的编码转换为 UTF-8,重新上传覆盖原文件即可。+ y4 c5 D9 a6 B% a0 y0 w

" L) \: k9 U+ o3 h5 t7. 更新缓存
/ `3 M6 F( s, h4 V+ [& C
$ R) `; s& I2 d/ P# o: ?登录后台,更新所有缓存(数据缓存、模板缓存、DIY模块分类缓存)。
5 ?/ e0 ~& v! J! r& w, o  V8 f. Y- N
- W6 Z/ p. }1 _; [& L" H8. 检查问题% V- I) P" d! w. }  W- A/ a2 @

$ R. F5 K7 S2 G& o. N) F' R至此基本转换完成,需要仔细检查有无其他问题,重点检查插件、模板等是否工作正常。1 D' E, I# Q0 W8 {9 l$ [

* F! o) D+ y: ]) G9. 在正式环境部署上线
4 r9 c' U% l7 q) b
" ~2 H% _# o7 H* x: {8 n: V一定要先阅读下面的 FAQ 再决定开始部署。
( j; l" f% x$ u. }
7 u: P2 t$ N; `, u) a& U将以上步骤在正式服务器上重新操作一遍。需要注意将 config 中的数据库改为正式数据库,内存缓存无需关闭,在第 7 步更新缓存时要把内存缓存清空。
2 W3 L$ l% B8 T3 F( Z; \( h$ x7 E$ d( O! @, n8 _, b9 L& m: @
F.A.Q.4 n2 E! K: T7 M" A: y3 e4 N* R2 \

# `  I% ?* E  U+ C7 }Q: 转换数据库后,登录验证问答无法通过9 x0 C+ B! ^5 x0 V) b, ^; X, J6 _
A: Discuz! 登录验证问答的加密算法为“substr(md5($answer.md5($questionid))”,结果与所用编码相关。可以参考这里修改代码,强制使用 GBK 来编码答案。
& a5 C% q; _' K+ x" K' W( {8 C2 e4 J0 U7 \
Q: 转换模板后打开网站依旧乱码
7 k% [9 B  {1 t# D- W5 |/ k5 c8 ~A: 请确认已经在后台更新缓存,如果依旧乱码,请 SSH 到服务器,运行 sync 命令。如果还不行,可以尝试修改乱码的模板(比如随便改一个字符),上传服务器,Discuz! 检测到文件变动后会重新刷新模板缓存,然后再将模板还原后上传。; I( x& }( C, M- K! o( R7 ^
( T  c0 C: N. n4 c/ o( R7 i
Q: 站点统计内部分数据乱码& V+ m9 k4 D) \5 H6 c' H
A: 等到下一个更新时间数据刷新后就正常了) b' z' T0 O( M, G- c, p
  S5 `) W4 S" N8 L/ ]8 I- c4 s9 A- }7 k
Q: 上传模板后 DIY 模块消失
/ M& v; f) Q5 W, a! B8 oA: 到 data/diy/template/模板名 下面寻找 .bak 文件,重新 diy,选择恢复这个文件即可。( P1 w) _& F" k2 I3 v# C, q

4 ~% M% W# e! q* |( q5 j/ NQ: 部分论坛设置、插件设置行为诡异或设置丢失' T# ?7 C( W8 O' A2 Q
A: 很大可能是第 4 步修复数据库时,migrate_db.php 没有处理到相关数据表的字段。请仔细检查有无漏掉的数据表字段。0 P0 b0 e4 m( B) ?- c, k
. j' o2 o( O7 g" d. Q4 O2 N, g  i
Q: 如何方便地批量转换编码?' G0 v; A& M' Z7 [5 }1 [- M, \
A: 在 Linux 环境可以使用 iconv 命令(请稍微学习一下这条命令,使用很方便)。在 Windows 下可以使用 Codepage Converter 这个工具(已在附件提供)。
8 _, R3 b8 F6 h/ F

快速回帖 使用高级回帖 (可批量传图、还有插入视频等功能哦!)

您需要登录后才可以回帖 登录 | 注册

  • 发布信息免费
  • 发贴彩色标题
  • 签到额外经验值

如何快速提升等级,查看[积分规则]

活动中心

查看更多>>
最新热版
会员排行
©2009-2016 西班牙华人网 http://www.laicw.eu西班牙文化部注册管理西中文化传媒促进会主办Powered byDiscuz!X3"世界华文媒体合作联盟"成员|| | | 联系站长
发帖 客服 微信 手机版 举报