我这里有一个安装在WIN2K上的 8.1.5.0.0 版本的数据库,由于操作系统与数据库管理系统的版本太老不太利于维护,我想将数据弄到一个新环境里(姑且不考虑程序兼容性等问题),新环境拟为WIN2K3+10G。我用的是EXP与IMP工具(据我了解它们应该没有字符集相关的参数),导入时会提示EXP时使用的字符集与IMP时的不一样,导入完成后中文全变乱码。原数据库的字符集设置为
NLS_CHARACTERSET=US7ASCII
NLS_NCHAR_CHARACTERSET=ZHS16GBK我是从9I开始接触ORACLE的,里面又有好几G的重要数据,因此我不敢对原服务器做任何修改,估计就算改了字符集设置,数据本身的编码也不会跟着变化。
想在新环境中做手脚,可是10G只有NLS_CHARACTERSET可以设成如8I中的设置,NLS_NCHAR_CHARACTERSET只能设为UTF8与AL16UTF16之一,如果改为其他值就会报“ORA-12714: invalid national character set specified”错误。有没有什么方法把NLS_NCHAR_CHARACTERSET设成ZHS16GBK呢?
如果说改NLS_NCHAR_CHARACTERSET的值不可行或是不合理,那么有没有什么工具可以在导出原数据时修改字符的编码以利于我将数据放入新环境?我有试过用PL/SQL Developer提供的“SQL Inserts”和“PL/SQL Developer”格式导出数据,但“SQL Inserts”格式不允许表中出现LONG型数据,不满足我的数据要求;“PL/SQL Developer”格式在正确导入一部分表的数据后,突然某个表无法完整导入,其后的所有表都没导入数据,看上去像是C语言里遇到'\0'的现象。
再或者是不是10G及以上都不可能完成我所需要的任务了呢,那么我是该选用9I(跟10G一样不能把NLS_NCHAR_CHARACTERSET设成ZHS16GBK)还是继续死守8I?以我微薄的经验看,我这服务器上的8I连DBCA删除一个数据库都成问题,实在不敢面对维护8I的日子啊。请各位大虾给点指示,真的很苦闷

解决方案 »

  1.   

    试试先8i到9i,然后由9i到10g字符集都保持不变。
      

  2.   


    我的问题中有说明,9I已经无法设置8I中那种NLS_NCHAR_CHARACTERSET值了。
      

  3.   

    想到一个点子,明天装一个8I把数据弄进去,然后升级DBMS,看行不行得通。但愿ORACLE的升级做得很平滑,以免我卷进升级的是非中去。
      

  4.   


    9i是新安装的,设置不了那个值?安装的时候选择上原有的数据库字符集就可以了呀。怎么会没有呢?注意是数据库字符集和国家字符集(这个是NVARCH的)。 两个都和8i的对应上。
      

  5.   

    新装的9I不支持ZHS16GBK作为国家字符集,以下是截图。自己通过命令行修改的话会出现“ORA-12714: invalid national character set specified”错误。
      

  6.   

    晕,不懂怎么上传图片。正在申请CSDN空间的相册,不知能不能用。
      

  7.   


    不好意思,一直没把图片上传的问题解决好。总之9I默认安装好是不支持国家字符集设成ZHS16GBK的。参考http://www.sqlclub.cn/oraclebasic/2009-04/3712.htm把数据库启动到restricted session,然后用命令
    alter database national character set INTERNAL_CONVERT ZHS16GBK;
    此法行不通。我已经说了N遍了,在9I和10G中都会报“ORA-12714: invalid national character set specified”错误。谢谢各位!小弟热切等候各位的帮助。
      

  8.   

    8i中乱码的字段数据类型是nchar吗?
      

  9.   


    应该是所有的中文数据都变乱码,我见有些字段是char类型的,估计nchar类型不多甚至是没有用到。
      

  10.   

    大哥们,这问题难道都没人经历过?我相信只要数据库中有中文,或多或少都会面对这样那样的字符集问题吧,我可不想再翻译一遍放到国外的mailing list上去,我觉得中国人都处理不过来了,外国人成天只面对那26个字母更是不太可能搞得定的。
      

  11.   

    这样的话,也就是说你8i中没用nchar或nvarchar2,只用NLS_CHARACTERSET=US7ASCII来存放中文。
    那NLS_NCHAR_CHARACTERSET可以不管了。你在9i中NLS_CHARACTERSET=US7ASCII,NLS_NCHAR_CHARACTERSET随便用一个。
    注意做exp和imp操作所在主机的环境变量nls_lang中的字符集都用US7ASCII
      

  12.   

    隔了10来天没弄这问题,再试一次,居然成功了。
    也不知之前是怎么搞的,会坚信NCHAR也得设置成一样。可能是由于断断续续地,脑海中出现幻像了吧。不服气,再试一次贴图