全文由bitbobo总结,加其他一些高手的建议。 至今的VB3.5 GOLD中文版也没有完美解决数据从以前的GB2312,BIG5代码自动转换至UTF-8的问题,所以当论坛安装有其他西方语言时,面板文字是西文,中文帖子却是乱码很别扭。 想起很早以前从vbzh.com看到的帖子。 但这个转换代码有不少局限性,如果以前装的是3.0.7插件版,事先必须将以前插件对数据库的改动(比如添加了新table或者field什么的)都还原到最初的3。07的状态。然后再用转换工具,否则转换出来的仍是乱码。 问题是,即使卸载所有插件,转换升级后仍有不少乱码。必须手动运用Iconv函数。很是麻烦,工作量不小。 看过有人发的Utf-8编码转换方法,不知道行不行。还没有试验。
转自:http://www.twvbb.com/vbb/showthread.php?t=385 作者:tomex_ou 前言: ----- 自从vbb3.5释出utf8版,资料库必须由vbb3.0.x中的gb2312或big5升级至utf8编码 一般教法是汇出资料成insert sql,再用UltraEdit等文书编辑器转成uft8编码再汇 入mysql db。然而,假如世事绝不会那么简单的... 后来在vbzh.com发现007pig所撰写的利用php中iconv自动转换资料库相关文字栏位为 utf8的程式(go.php),我立刻拿来实验,以下是我的实验平台及环境: old平台: OS: windows 2003/ apache 1.3 PHP: 4.4.0 MySQL: 4.1.9 /latin1 VBB: NewsVBB 3.0.3 Core 1 db charset: big5 new平台: OS: windows 2003/ apache 1.3 PHP: 4.4.0 MySQL: 4.1.14 /utf8 VBB: 3.0.5 Gold UTF8 db charset: utf8 首先, go.php该程式的建议方式是先转换db成utf8再作vbb的升级,然后因为我的vbb 是插件版,直升至vbb3.5结果仍然整个版面都是乱码,然而我也不晓得原newvbb3.0.3 多了哪一些插件栏位,不可能在go.php的转换栏位加上去。 以下是我的go.php配置: $config['sourcecharset'] = 'BIG5'; // 论坛资料库设定 $config['dbhost'] = 'localhost'; // 主机位置 $config['dbusername'] = 'root'; // 资料库使用者帐号 $config['dbpassword'] = ''; // 密码 $config['dbname'] = 'old_forum'; // 资料库名称 //$config['dbcharset'] = 'latin1'; // 若为 MySQL 4.1+,资料库的 character set $config['dbcharset'] = 'utf8'; // 若为 MySQL 4.1+,资料库的 character set $config['tableprefix'] = ''; // 前缀词 在这儿要提醒一个容易犯的错误,当你转换utf8时,其结果是否正确,请用phpmyadmin来验证 只要在ie/uft8编码下能正常看到文字,就代表正常了。很多人换转后仍发现是乱码,可能原因 是你误判目前mysql预设的编码,应该请在my.ini中加入: [mysqld] default-character-set=utf8 default-collation=utf8_general_ci 再重新启动mysql,再进行go.php的转换。 手动转换: --------- 正如前言所述,世事如奇,不可能这么容易成功的,go.php中言明若有其他插件栏位会导致转 码失败,偏偏我又无法掌握这些栏位。而且原插件db硬升级变成乱乱的,因此决定使用手动转换 vbb的db资料内容,我先在mysql建立一个以utf8编码的db(new_forum),再进行全新vbb3.5安装, 得到一个3.5的db,然后再旧的db搬至新的mysql/data目录下重新启动,以下是新旧db的比较: 原来的db请先用go.php转换为utf8: old_forum (87个table, NewVBB 3.0.3 core 1.0, latin/big5) 变成: old_forum (87个table, NewVBB 3.0.3 core 1.0, utf8/utf8) new_forum (95个table, VBB 3.5 Gold, utf8/utf8) 这时候我的最新mysql 4.1.14版本已含有两个新旧db,而且我的新的vbb3.5正指向new_forum 且正常地运作最原始刚安装完成的模样,我将逐次从old_forum中将其资料汇入new_forum,再 由vbb3.5网页来验证是否成功。 我曾经从vbb2.x成功手动转换至vbb3.0.3的成功经验,大概重要的table如下: user (使用者资料) forum (版面资料) thread (主题列表) post (帖子内容) 上面这四个table有些控制它们的权限,如userfield, usergroup 也需一并移转。 其余table再慢慢比对移入即可,vbb3.x table的对映意义,我将它放入附件里头。 资料汇入: --------- 两个db要如何移动其内容资料,在sql server2000有很方便的DTS可转换底层资料,而mysql没 这种东西,竟要用insert sql这种阳春且容易资料库大而汇入time-out的汇入方式。况止我们的 资料是utf8,当汇出成文字档时会变成“???”,根本不晓得资料是否正确! 因此我采用sql insert指令来同时操作两个db的资料移转,语法为: INSERT INTO new_forum(栏位1, 栏位2, 栏位3...) SELECT 栏位1, 栏位2, 栏位3... FROM old_forum; 产生及比对那些栏位名称很烦,幸好我用phpmyadmin汇出insert资料,很容易就取得其栏位列表 而vbb3.0.3插件版跟vbb 3.5 gold栏位顺序都差不多,我把插件版的栏位排除掉, 因此能顺利地汇入资料。 为了将来重复使用这只vbb手动汇出入程序,我写了一个php程式来帮我执行这些指令,我利用 vbb3.5本身提供的db method来省去连结db的麻烦,我举简单的pm表格来作示范: <?php error_reporting(E_ALL & ~E_NOTICE); require_once('./global.php'); $OLD_DB = 'old_forum'; $NEW_DB = 'new_forum'; $TABLE_PREFIX = ''; // PM 悄悄话 $OLD_TABLE = "`$OLD_DB`.`pm`"; $NEW_TABLE = "`$NEW_DB`.`pm`"; $db->query_write("TRUNCATE TABLE $NEW_TABLE;"); $sql = " INSERT INTO $NEW_TABLE (`pmid`, `pmtextid`, `userid`, `folderid`, `messageread`) SELECT `pmid`, `pmtextid`, `userid`, `folderid`, `messageread` FROM $OLD_TABLE; "; $db->query_write($sql); echo "Transfering data from '$OLD_TABLE' to '$NEW_TABLE'... [OK]<br/>"; ?> 透过工具,这些sql指令的产生及比对没有想像中的难,反而很容易,而且不会有什么特殊码冲突问题 不像我以前是透过EMS MySQL Manager先汇出在xml,再汇入一一对映栏位,反而弄得半死又不能重复 使用,如今这手动转换方式是我所满意的,安全又容易。我将四大表格的汇入程序也放入附件中。 资料整合: --------- 手动汇转资料后,从vb3.5网页中看起来都蛮正常的,但背后的表格linking中可能会存在一些风险, 例如我发现use表格中的password资料汇入后长度竟变长了,但不会影响登入,我想可能跟vbb或mysql 的md5转换技术有关。另个例子,将三个悄悄话表格汇入后,其他使用者使用起来很正常,但发现管理 员在送悄悄话给别人时,却发现抓不到userid而导致db insert错误。 看到这里,你可别慌急,因为这可以是vbb的bug或者是需要去调整的部分,应该不是db资料本身的错。 这部分我仍在探究原因追查中,但它不影响主要的运作(因为看起来都蛮正常的),因此我先把手动汇转 uft8的技术先分享给大家,因为我发现很多人像我一样,为了转uft8而痛苦好多天呀... 结论: ------ 学会手动汇转vbb资料的技术,对一个vbb站长有很大的用处,不仅你能完全控制资料,以后不管什么插 件栏位的资料转换,也难不倒你了。而且控制了资料库,你可以自行做很多类似我那手动转换的.php档 来作一些插件,当然要完全跟论坛整合,你还需要很了解vbb的架构才行,包括它的物件使用方式/语法 而这些,并不在这篇教学提及范围内。 做完上述手动汇转资料后,你还得注意相关控制的table,并且在后台去调整站台设定值,因为这部分 常常在变化新增,因此我的汇转程式不去作这些,而是重新自行设定,这样比较干净。老实说,是因为 我不太懂得如何将这些后台设定档或语言/风格档汇出成xml的技术啦...若你了解的话,可以pm跟我说 那么下次我才能做更自动化的程序呀。 我还在汇转资料中,并且研究如何有限度地引入插件程式,因为这次插件使用原则,是尽量不变更db 结构,这样未来作升级时,就可由vbb自行来处理这部分。我喜欢插件的资料表格能独立成另一table 的方式,因为这样就不用跟vbb绑在一起了,虽然它的效能可能低落点,但模组化绝对有好处。
转自:NEWVBB 作者:tomex_ou 陸續加入許多tables的匯轉程序,解決了悄悄話有問題的bug。 為方便單一table匯轉控制,我用個array控制是否要轉換,只要設為true即會轉換: PHP: $dbTables = array( 'announcement' => false, 'attachment' => false, 'attachmenttype' => false, 'avatar' => false, 'event' => false, 'forum' => false, 'forumpermission' => false, 'moderator' => false, 'pm' => false, 'pmreceipt' => false, 'pmtext' => false, 'poll' => false, 'pollvote' => false, 'post' => false, 'smilie' => false, 'thread' => false, 'threadrate' => false, 'user' => false, 'userfield' => false, 'usergroup' => false, 'usertextfield' => false, 'usertitle' => false, 以下附件已經可以轉一個完整的vbb 3.5了! 不同的版本也可以讓它跑 有error再修正即可,也很方便。 若你的web-hosting db的話,這方式可以比較麻煩點...