对于8i以上产品,可以采用“Alter database character set 字符集”来修改数据库的字符集(子集到超集),对于你的问题,是不是可以先做完整的数据库导出,用想要的字符集重建一个库,然后编辑一下导出文件,再导入到新库中。
修改方法:
需要一个2进制文件编辑工具,如uedit32。用编辑方式打开导出的dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进制数,为1,使用函数NLS_CHARSET_NAME即可获得该字符集: 
SQL> select nls_charset_name(1) from dual; 
NLS_CHARSET_NAME(1) 
------------------- 
US7ASCII 
可以知道该dmp文件的字符集为US7ASCII,如果需要把该dmp文件的字符集换成ZHS16GBK,则需要用NLS_CHARSET_ID获取该字符集的编号: 
SQL> select nls_charset_id('zhs16gbk') from dual; 
NLS_CHARSET_ID('ZHS16GBK') 
-------------------------- 
852 
把852换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。

解决方案 »

  1.   

    字符级
    http://www.ncn.cn/oracle/admin/nls_convert1.htm
    http://www2.ccw.com.cn/tips/9906/062804_04.asp
      

  2.   

    http://www.ncn.cn/oracle/admin/nls_convert1.htm
    这个帖子让我都晕了
      

  3.   

    给分给我.我这个方法一定可以..
    SVRMGR> SHUTDOWN IMMEDIATE; 
    SVRMGR> STARTUP MOUNT; 
    SVRMGR> ALTER SYSTEM ENABLE RESTRICTED SESSION; 
    SVRMGR> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
    SVRMGR> ALTER SYSTEM SET AQ_TM_PROCESSES=0; 
    SVRMGR> ALTER DATABASE OPEN; 
    SVRMGR> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK; 
    SVRMGR> ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE ZHS16GBK; 
    SVRMGR> SHUTDOWN IMMEDIATE;
    SVRMGR> STARTUP RESTRICT; 
    SVRMGR> SHUTDOWN IMMEDIATE;
    SVRMGR> STARTUP
      

  4.   

    我在Oracle8.0.5中也碰到过这种问题,我的Oracle8.0.5是装在AIX上的,
    我用以下解决了这个问题
    SVRMGRL
    SVRMGRL>CONNECT INTERNAL/ORACLE
    SVRMGRL>SHUTDOWN IMMEDIATE; 
    SVRMGRL>STARTUP 
    SVRMGRL>UPDATE PROPS$ SET VALUE$='ZHS16GBK' WHERE NAME LIKE 'NLS_CHAR%';
    SVRMGRL>connect internal
    SVRMGRL>SHUTDOWN IMMEDIATE; 
    SVRMGRL>STARTUP
      

  5.   

    有关字符集的问题一直困扰着好多人,ITPUB论坛上也曾有很多人讨论过,不过有些问题因为没亲自实验过,还是不能完全明了,据说:ITPUB数据库技术从书之一《Oracle数据库DBA技术精粹》说的比较清楚,我准备去买一本看看,不知是否有人看过这本书,内容到底如何。如果本论坛上有人对字符集问题比较清楚,建议写篇文章,一准会受欢迎。
      

  6.   

    to  aegir(周翡) 
    我执行你给我的语句,到了
    ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK; 执行后
    提示ORA-12710 大概中文的意思就是“新的字符集必须有个旧的设置”
    后来我执行ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE ZHS16GBK; 这句也同样的错误。
    望高手指点一二
      

  7.   

    那个错误的英文是
    ORA-12710 :new character set must be a superset of old characterset
      

  8.   

    修改字符集这样写:
    ALTER DATABASE CHARACTER SET ZHS16GBK;
    对于8i以下版本是否能用,我不知道。你试试
    提示是:新字符集必须是旧字符集的超集,
    而ZHS16GBK就是US7ASCII的超集。
      

  9.   

    ALTER DATABASE CHARACTER SET ZHS16GBK;
    这个命令据说8I以上版本支持,前面我说的方法
    你试了吗,不行吗?
      

  10.   

    不过我的环境是ORACLE 9.2,刚开始是英文字符.后改为支持简体中文.
    PS:千万不要改动PROPS$表.
      

  11.   

    用uedit32修改导出文件的方法也试了吗,改了后,导入不成功?,提示什么错误了?
      

  12.   

    ORA-12710 :new character set must be a superset of old characterset
    就是这个错误啊。好像805的就是不行啊。。:(而且,你说的导出文件是不是只是针对于逻辑备份?在一台新机子上装805,用中文字符集。在旧机子上是805的US7ASCII版本,把其做冷备份(逻辑备份不全),然后导到新的机子上,是不是字符集还是US7ASCII了?怎么才能变成中文的?
      

  13.   

    冷备份的还原不会改变字符集,通过Alter database character set 字符集;(比如zhs16gbk)可以改。但805版的我没试过。
    现在给你几点建议:
    1、升级805到8i最好是8.1.6以上,然后通过Alter database character set 字符集;更改字符集。
    2、继续在网上提问,寻求直接更改805字符集的方法。
    3、作一个按模式的导出(包括你所有的业务数据),更改导出文件的字符集(方法如上),使用新的字符集重建一个数据库。然后导入到新库中。注意如果你在客户端运行导出,最好将客户端的NLS_LANG中的字符集设置于服务器一致。
    比如导出时:
    服务器端:US7ASCII 客户端:nls_lang=American_America.US7ASCII
    导入时:
    服务器端:zhs16gbk 客户端:nls_lang=simplified chinese_china.zhs16gbk
    这个方法我做过多次试验,均成功。
    最后提醒,做实验前,都要留备份。
      

  14.   

    我这边的方法是注册表下的"\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE"下的子文件夹,凡有"NLS_LANG"的项,将其项值"NA"清空.    @注意备份注册表