古城电影中心 精品软件下载 联系我们
设为首页收藏本站帮助

古城IT技术联盟

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 380|回复: 1
收起左侧

以DiscuzX2.5为例,轻松转换数据库编码,实现GBK和UTF8互转

[复制链接]
发表于 2014-6-11 23:41:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
* o  B3 c5 ]+ A# p
经常遇到有人需要在常见的GBK和UTF8之间转换,这里以
discuzX2.5为例,由SC_UTF8转换为SC_GBK,结合我自己的一些经验,提供一个较为建议的数据库编码转换方法,此方法不求通用,却能解决大部分中小站长遇到的类似问题
9 R# Z! z- @# Q- O( m( D3 M$ S' ?7 ?. F
总体思路其实挺简单的,我们先通过SQL语句获取到数据库里面的全部表名,然后对所有需要转换的表执行一次对应的编码转换。
: E1 a) t/ V* j# u3 l4 i, R* y: q
这里我们使用到的工具是Navicat for mysql  10.1,这是一个非常好用的数据库管理工具,稳定易用,适合新手- J( Y; }+ P) V. D
4 R  E, x2 B! T8 L2 J" j# Q9 p* ?" ^
& e7 q8 s/ l/ _3 h0 h0 X/ T- a
获取数据表名. v" Y' k2 l) i7 x
9 F  b: k7 i7 k

3 O% }6 w! T/ R, m开始前,请先仔细阅读文末的注意事项。
4 D) J5 A( [, d/ m! v" K2 n$ m
0 F2 c/ E% i  D; F7 O& {Discuz的数据表比较多,为了能批量转换,这里我们先想办法获取一下全部表名。当然,这里使用到的方法并不是单纯读取表名,而是生成一串带有这些表名的SQL语句,以便下一步能使用。
5 Z. W- C. A7 ~1 U. T2 f$ v
( M7 _( E; ?5 ]$ @我们用Navicat连接上我们的数据库,然后执行一次查询,查询用的语句如下,然后下面有对应的操作图例。! T# A4 z0 E# F# S
( y$ _/ }/ l  _! w
/ g0 I8 ?( G2 t# o! W) Z, H/ S
! X) O$ U; Q9 M& u- G1 P
$ C8 q, s( F( _% \# \3 n
+ W+ w/ |' t5 G, |' i3 Y
0 g7 N# E4 T* f/ p( |' w

" J+ ^! J# X/ E9 T- J6 Y, B- s* _5 T) c
6 m6 I; G7 X/ Y/ b, n2 g5 o
. E9 ]: Q' W, @) Q

: F, ^9 o# d- |1 s9 u. }1 J" o) b5 h* s4 [7 G

$ ~! t  V2 G" u- A
0 K- _8 f5 e4 o% r% H5 o

" p! i2 S7 C7 p/ n& V0 g# J& t( A3 D6 B4 k$ f- i% P# y
% s) \. {+ K0 @( s# Y( O

8 R6 u5 I' N6 W8 ~
3 ^2 M! S- {* p) g7 Q. F

6 u$ ]/ I4 Y* D# v
& |& G: P( x5 x6 [6 L& r
  1. Select CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO ', 111,';' ) FROM information_schema.tables Where table_name LIKE 'pre_%';
    ! c' S* ?7 c0 x6 f# J! H( x
复制代码
+ j! [) n) p, T" R
3 z0 D9 {0 |  q1 \5 ^* `, u0 f
这个语句里面需要我们注意一下的是pre_这一段,这里是特意指定一下特定的表前缀,DiscuzX默认的是pre_,如果你改过,就把这里改成你的% m; B; U3 ]$ d+ ~7 i
- Y' e! C3 L- H0 ~! D8 c
. \" m1 N* y4 [# K: W5 F' P. G
& S( f" U9 n4 z$ Z/ h0 U- t
' c- |2 x( \# g( Z! L- _
" t0 ?5 w: E& t1 y; \% \& x

" o  v  o& g% ? / e" b, M% B6 g/ w
5 S# B6 g# `; y0 c

4 W" R5 M* Y& ~! M/ K+ C5 V执行完上面的语句后,我们就会得到如上图的结果,我们把区域3中的内容全部复制出来,这里可以使用ctrl+A多选,然后右键复制即可。内容复制出来后,我们将内容贴到一个txt里面。
6 Y: m; N( M+ c; H6 s  D$ a
  ~6 M5 w8 b2 p
6 }' g5 W5 Y$ [! L- E8 j3 M- y2 R
- S8 v8 z/ f7 Y! e* \6 s2 n
: B, @2 n  k( e5 G2 J; U0 m+ K : J! J) j; i# Q  Y4 z
! m8 g, I: y2 n5 K# C3 r

1 L% P2 l. S# E  T4 i贴到txt里面后,用记事本的批量替换功能,将其中的    RENAME TO  111 这一段替换为DEFAULT CHARACTER SET=gbk COLLATE=gbk_chinese_ci,这一段是转换为gbk,如果你是从gbk转换为utf8的话,则相应的替换为DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci即可,如上图所示。
# j# A9 S' K7 a# P/ F2 P+ H4 K5 |; B! {) e+ z5 F
转换数据库编码
. D7 i7 O( S( e5 c, G* Z% M$ h5 f2 y' D7 P
接下来我们将批量替换好之后的所有语句再复制到Navicat的查询器内执行,这个查询器就是我们上面步骤有用到的查询,如下图例  b' S# n' Z6 G  l! {) O; F: S

% y7 d/ N4 g. W, q3 [7 t9 [
  g# z" y, Q- |* a" F! I
! K  Y7 J0 |1 ]7 c
2 G* ^0 {0 z9 h/ o: A/ y接着我们只需要等语句执行完毕即可。
  l  o4 Q+ K. s$ p$ Y5 Q2 a' T
注意事项" x. [& H0 Y: v) u% m

; t9 m& P* D; O7 _% b1、执行此操作前,请务必先完整备份数据库,以免转换过程中出现差错造成数据丢失等问题。
5 b1 B$ Y2 Q  h1 p" s9 O. X5 N
/ E7 K) i: S, T7 w# K: e2、转换过程中应尽量避免再对数据库进行读写。
# I1 c; c- t" |: @) D/ Q
  z+ s' c+ Q; g3、最后的转换步骤有可能稍微需要一点时间,视数据库性能和大小而定,需要耐心等待。/ {! J- D% ?$ \4 w
1 f9 O2 y* \& |1 ^! f) i% r0 B
4、此方法仅针对数据库,如果你是要完整转换一个DZ,还需要替换所有的文件,包括模板和插件,需要仔细更新所有缓存。
* g: U% H8 Y/ _; p3 f0 \, {( D& D) u  t; n, @2 ~; W
5、本方法不完全保证100%安全性,仅按个人经验提供方法,遇到问题责任自负。
& o( y1 H1 Z7 k' B! @, n7 r& j, \# L) z0 {8 V# P, ^
发表于 2015-3-29 15:27:25 | 显示全部楼层
不晓得。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|古城IT技术联盟 ( 辽ICP备16008648号 )

GMT+8, 2020-2-24 19:58 , Processed in 0.089313 second(s), 24 queries , Gzip On, MemCached On.

52occ.com Team 古城世纪自优化版本

© 2006-2013 Lonhowe.cn

快速回复 返回顶部 返回列表