1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

谁能帮个忙,帮我把Vb 3.0.7升级至3.5代码转换一下。

本帖由 扬子2005-11-15 发布。版面名称:源码讨论

  1. 扬子

    扬子 Member

    注册:
    2005-09-05
    帖子:
    949
    赞:
    2
    vbzh提供的gb-->utf8的转换工具: go.php 不会搞。
    数据库有21M,搞定了,不慎感激啊。
     
  2. A君

    A君 Well-Known Member

    注册:
    2005-08-31
    帖子:
    19,987
    赞:
    98
    谁搞定的?
     
  3. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    全文由bitbobo总结,加其他一些高手的建议。


    至今的VB3.5 GOLD中文版也没有完美解决数据从以前的GB2312,BIG5代码自动转换至UTF-8的问题,所以当论坛安装有其他西方语言时,面板文字是西文,中文帖子却是乱码很别扭。

    想起很早以前从vbzh.com看到的帖子。
    但这个转换代码有不少局限性,如果以前装的是3.0.7插件版,事先必须将以前插件对数据库的改动(比如添加了新table或者field什么的)都还原到最初的3。07的状态。然后再用转换工具,否则转换出来的仍是乱码。

    问题是,即使卸载所有插件,转换升级后仍有不少乱码。必须手动运用Iconv函数。很是麻烦,工作量不小。


    看过有人发的Utf-8编码转换方法,不知道行不行。还没有试验。

     
    #3 小叶, 2005-11-15
    最后编辑: 2005-11-15
  4. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    转自: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绑在一起了,虽然它的效能可能低落点,但模组化绝对有好处。
     
  5. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    转自: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的話,這方式可以比較麻煩點...
     
  6. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    看完这么多,不知道有没有帮助
     
  7. 扬子

    扬子 Member

    注册:
    2005-09-05
    帖子:
    949
    赞:
    2
    谢谢,这篇贴子我上午就看到了,试了一下午都没成功:(
     
  8. yeshou

    yeshou New Member

    注册:
    2005-09-06
    帖子:
    7,067
    赞:
    34
    经过我们的不断努力 vb官方已经在3.5.1种加入对iconv的支持
    只要服务器支持iconv 就可以使用GBK编码的软件包
     
  9. bitbob

    bitbob New Member

    注册:
    2005-09-07
    帖子:
    111
    赞:
    0
    现在不需要这么麻烦了,Joey发的那个UTF-8转换程序只需鼠标轻轻一点就全部搞定了。
     
    #9 bitbob, 2005-11-15
    最后编辑: 2006-10-18
  10. jcking

    jcking Well-Known Member

    注册:
    2005-08-30
    帖子:
    22,282
    赞:
    70
    我不会.