rt

解决方案 »

  1.   

    在NT环境下查询:
     select * from nls_database_parameters
     -------------------------------------
     看看数据库的字符集是什么 然后查看solaris环境下的字符集,如果不相同,可修改
     环境变量
     setenv NLS_LANG=语言_区域.字符集  例如:nls_lang=AMERICAN_AMERICA.US7ASCII
      或者  nls_lang=AMERICAN_AMERICA.ZHS16GBK 注意:不要随便修改数据库的字符集,如果需要修改,必须保证服务端的
          字符集是所有客户端字符集的超类.
      

  2.   

    from csdn.net
    使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个2进制文件编辑工具即可,如uedit32。用编辑方式打开导出的dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进制数,为1,使用函数NLS_CHARSET_NAME即可获得该字符集:(ultraedit 打开几百M到上G的文件很慢,我试了winHex,哪个速度啊,闪电!)
    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字符集的数据库就可以了。(注意,十进制数与十六进制之间的转换,想明白其中的道理)SQL> select nls_charset_id('zhs16cgb231280') from dual;NLS_CHARSET_ID('ZHS16CGB231280')
    --------------------------------
                                 850字符集            代码(十进制)   对应的dmp文件(2、3字节/二进制)
    ZHS16CGB231280    850              03 52
    ZHS16GBK          852              03 54
      

  3.   

    更改完后再倒入时提示:不正确的DMP文件
      

  4.   


    先用 setenv NLS_LANG=语言_区域.字符集,设置字符集
    然后
    用相同的客户段导入和倒出
      

  5.   

    楼上的,solaris要TELNET到SUN上倒出DMP,然后FTP到SUN服务器上把倒出文件GET到本地,倒入时要到NT服务器上,怎么用相同的客户端倒入和倒出?请指教!!
      

  6.   

    //
    更改完后再倒入时提示:不正确的DMP文件
    //那我知道你的问题了,因为我也遇到过,呵呵。
    那用solaris上传.dmp文件的时候使用的是ascci模式,所以dmp文件出错了。
    用下面命令把solaris上的.dmp文件上传到windows.
    ftp>binary
    ftp>put xxx.dmp注意,一定要用binary模式上传文件,不管你是否上传到windows或者其他操作系统。
      

  7.   

    jdsnxing(小熊) 也来了?问题没解决,顶上去
    -------------------------------------------------------
    to  daydayupliq(强强)
    为什么要 把2、3字节的00 01改掉呢,请详细解释一下原理。
      

  8.   

    数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。 
      客户端字符集环境select * from nls_instance_parameter,其来源于v$parameter, 
    表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表 
      会话字符集环境 select * from nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。 
      客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件 
      字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
    怎么样修改字符集 
    [A]8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误。 
    Startup nomount; 
    Alter database mount exclusive; 
    Alter system enable restricted session; 
    Alter system set job_queue_process=0; 
    Alter database open; 
    Alter database character set zhs16gbk; 
    UPDATE SYS.PROPS$ SET VALUE$='WE8ISO8859P1' WHERE NAME LIKE 'NLS_CHAR%';我现在有一个备份文件A.DMP,采用的字符集是AMERICAN_AMERICA.WE8ISO8859P1  我想在安装有SIMPLIFIED CHINESE_CHINA.ZHS16GBK字符集的数据库中恢复,请问怎样做?要注意什么?步骤。
        1。SQL>CONNECT SYSTEM/MANAGER      SQL>UPDATE SYS.PROPS$ SET VALUE$='WE8ISO8859P1' WHERE NAME LIKE 'NLS_CHAR%';
        2.修改注册表,NLS_LANG的值为AMERICAN_AMERICA.WE8ISO8859P1
        3。重新启动数据库。
       IMP USER/PA WD FILE=A。DMP FULL=Y LOG = A.TXT
       ok! 
    --------------------------------------------------------------------------------------------------
    1. 2服务器指定字符集与客户字符集相同,与加载数据字符集不一致。  ---- 这类问题一般发生在ORACLE版本升级或重新安装系统时选择了与原来服务器端不同的字符集,而恢复加载的备份数据仍是按原字符集卸出的场合,以及加载从其它使用不同字符集的ORACLE数据库卸出的数据的情况。这两种情况中,不管服务器端和客户端字符集是否一致都无法显示汉字。解决办法见2.2。  2.2 强制加载数据字符集与服务器端字符集一致  ---- 假设要加载数据从原ORACLE数据库卸出时的字符集为US7ASCII,当前ORACLE服务器字符集为WE8ISO8859P1。  ---- 下面提供三种解决方法:  ---- (1) 服务器端重新安装ORACLE  ---- 在重新安装ORACLE 时选择与原卸出数据一致的字符集(本例为US7ASCII)。  ---- 加载原卸出的数据。  ---- 这种情况仅仅使用于空库和具有同一种字符集的数据。  ---- (2)强行修改服务器端ORACLE当前字符集  ---- 在用imp命令加载数据前,先在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:   SQL > create database  character set US7ASCII 
    * create database character set US7ASCII 
          ERROR at line 1: 
    ORA-01031: insufficient privileges 
    ---- 你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载数据。等数据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE数据库,在sql>命令提示符下,运行select * from V$NLS_PARAMETERS,可以看到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正确显示。  ---- (3)利用数据格式转储,避开字符集限制  ---- 这种方法主要用于加载外来ORACLE数据库的不同字符集数据。其方法如下:  ---- 先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为foxbase 格式或access格式数据库,再用转换工具转入到不同字符集的ORACLE数据库中,这样就避免了ORACLE字符集的困扰。目前数据库格式转换的工具很多,象power builder5.0以上版本提供的pipeline,Microsoft Access数据库提供的数据导入/导出功能等。转换方法参见有关资料说明。.  
      

  9.   

    昨天看了一下从OTN下载的资料,上面bobo 提到的有一点疏漏:
      
      " 客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件 "
    -----------------------------------------------------
      优先级最高的应该是显式的sql函数,例如:
       TO_CHAR(hiredate,'DD/MON/YYYY','NLS_DATE_LANGUAGE=AMERICAN')
      
      优先级从高到低排列顺序为:     显式的SQL函数->Alter Session->环境变量->参数文件->缺省值  详细的资料大家可以参考:
        << Oracle 9i Database Globalization Support Guide>>   OTN网站可以下载:
       http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96529.pdf 
      
      

  10.   

    to  jdsnhan(柳荫凉):    你没看到我说话吗?
        
      

  11.   

    to  RomanticProgrammer() 兰企鹅||南极俺最帅 () ( ) 信誉:100 帖子刷新的太慢了,所以嘛,没看到,嘻嘻!!
      

  12.   

    有那么麻烦么?呵呵,我从AIX上弄下来的,改一下就好使~
    telnet>exp>ftp>bin>put>改>imp