在服务器以及客户端都显示“???”,但我已经不知道原来备份的dmp文件的字符集是什么了!5555....,高手帮我啊!

解决方案 »

  1.   

    需要一个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
      

  2.   

    lightwind75(朝三暮四):对不起,我不是很明白您的意思,您用2进制编辑工具编辑完成后有什么用处呢?怎么才能察看原来的字符集阿?您说的使用NLS_CHARSET_NAME所获得的字符集是谁的字符集呢?请您详细说明一下好吗?
      

  3.   

    NLS_CHARSET_NAME是只oracle的字符集,看看oracle管理员手册吧。
    如果单纯是windows客户端显示乱码,改注册表。
      

  4.   

    2进制编辑工具打开后,看2和3字节的内容,这两个字节就是记录导出数据的字符集信息的,是16进制数,比如有的是0354(十进制为852)
    select nls_charset_name(852) from dual; 
    NLS_CHARSET_NAME(852) 
    ------------------- 
    zhs16gbk有的是0001(十进制为1)SQL> select nls_charset_name(1) from dual; 
    NLS_CHARSET_NAME(1) 
    ------------------- 
    US7ASCII 
    这样就知道导出的是什么字符集了
      

  5.   

    lightwind75(朝三暮四):你好,按照你的方法我已经确定了导出的dmp文件的字符集为US7ASCII,我现在正在重新安装数据库,请问在建库的时候,选择字符集时有两个选项:Character set以及National Character set,分别选择什么呢?谢谢!
      

  6.   

    2进制编辑工具打开后,看2和3字节的内容,这两个字节就是记录导出数据的字符集信息的,
    你的数据库字符集是简体中文,就改为0354,如果为US7ASCII,就改0001.
    这样导入后就不会有乱码了.
    用导入语句,
    imp 用户名/密码@数据库名 file='x:/xx/xx.dmp' full=y
      

  7.   

    有一篇文章
    明白ORACLE的多国语言设置,ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示,货币形式,排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的显示等有效。ORACLE的多国语言设置最主要的两个特性就是国家语言设置与字符集设置,国家语言设置决定了界面或提示使用的语言种类,字符集决定了数据库保存与字符集有关数据(如文本)时候的编码规则。正如刚才上面的一个小例子,环境变量NLS_LANG的不同,导致EXP帮助发生变化,这就是多国语言设置的作用(NLS_LANG包含国家语言设置与字符集设置,这里起作用的是国家语言设置,而不是字符集)。 
    ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,字符集在创建数据库的时候设定,并保存在数据库props$表中,对于8i以上产品,已经可以采用“Alter database character set 字符集”来修改数据库的字符集,但也仅仅是从子集到超集,不要通过update props$来修改字符集,如果是不支持的转换,可能会失去所有与字符集有关的数据,就是支持的转换,也可能导致数据库的不正常工作。字符集分为单字节字符集与多字节字符集,US7ASCII就是典型的单字节字符集,在这种字符集中length=lengthb,而ZHS16GBK就是常用的双字节字符集,在这里lengthb=2*length。 
    在客户端的字符集环境比较简单,主要就是环境变量或注册表项NLS_LANG,注意NLS_LANG的优先级别为:参数文件à注册表à环境变量àalter session。NLS_LANG的组成为“国家语言设置.字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客户端的字符集最好与数据库端一样(国家语言设置可以不一样,如zhs16gbk的字符集,客户端可以是nls_lang =simplified chinese_china.zhs16gbk或Ameircan_America.zhs16gbk,都不影响数据库字符的正常显示),如果字符集不一样,而且字符集的转换也不兼容,那么客户端的数据显示与导出/导入的与字符集有关的数据将都是乱码。 
    使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个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字符集的数据库就可以了。(注意,十进制数与十六进制之间的转换,想明白其中的道理) 
    4.1.4 跨版本使用Exp/Imp 
    Exp/Imp很多时候,可以跨版本使用,如在版本7与版本8之间导出导入数据,但这样做必须选择正确的版本,规则为: 
    ·总是使用IMP的版本匹配数据库的版本,如果要导入到816,则使用816的导入工具。 
    ·总是使用EXP的版本匹配两个数据库中低的那个版本,如在815与816之间互导,则使用815的EXP工具。
      

  8.   

    http://www.fanqiang.com/a2/b2/20010416/103640.html
      

  9.   

    Character set以及National Character set选一样就行
    其实这种情况有两种方法解决,一种是修改导出文件,(冷风)提供的就可以
    一种是修改数据库的字符集, Torrice(沙丁鱼)提供的网页里有详细说明。
      

  10.   

    各位:我把dmp文件的字符集改成和数据库的字符集一样了,导入后还是不行啊!服务器和客户端还是乱码(问号)!!我快崩溃了!5555......
      

  11.   

    你的数据库字符集设置和客户端NLS_LANG设置分别是什么,贴出来看看
      

  12.   

    服务器端和客户端都是:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    但导入后还是乱码,在服务器端用sqlplus查询也是乱码!
    我试过两种方法:1、重装服务器把数据库的字符集设成和原来的dmp文件一样
    2、直接用utraedit更改dmp文件,使其字符集和新建数据库的字符集一样
    两种方法都一样!!
    帮我.....555555555555555555555...
      

  13.   

    问题严重啊,你的数据库有中文,说明你原来用的是支持中文的字符集,但你的导出文件却是US7ASCII,说明你用来导出的机器的字符集设置是US7ASCII。这样的导出,文件中会有“?”(你可以用文本编辑器打开看看),这时用2进制编制器更改导出文件的字符集后,虽然可以导入到ZHS16GBK的数据库中,但原来的中文还是“?”,这个办法就不行了。另开帖子问吧,这个问题我不知该怎么办啊。关注
      

  14.   

    lightwind75(朝三暮四) :我是直接在服务器上导出的阿!
    有没有什么好的方法?
    谢谢!!
      

  15.   

    你在新建的数据库中输入新的数据能显示中文,说明你的数据库建得没问题。问号应该产生在导入之前,也就是说,导出后的dmp文件中,中文已经以问号的形式存在了。这很可能是导出时linux系统字符集不能识别从数据据库环境中导出的汉字(说明系统字符集和数据库建库时指定的字符集不一致),则系统将汉字以问号标识为不可识别码的方式写进dmp文件中了。虽然系统重装前后的配置一样,但是,dmp文件已经形成了,也就是说,问号乱码已经形成了,原来数据库又不存在了,如果这样,只能寻求高级的数据恢复技术先修复dmp文件,再导入。本菜鸟不懂数据恢复,爱莫能助啊。