ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle入门与认证 » 请教关于字符集的问题,我用imp命令导入发现中文全部乱码

标题: 请教关于字符集的问题,我用imp命令导入发现中文全部乱码
离线 new4oracle



精华贴数 0
个人空间 0
技术积分 68 (22264)
社区积分 0 (1773995)
注册日期 2008-5-11
论坛徽章:0
      
      

发表于 2008-6-25 01:06 
请教关于字符集的问题,我用imp命令导入发现中文全部乱码

请教关于字符集的问题,我用imp命令导入发现中文全部乱码
日志如下:
xport file created by EXPORT:V10.02.01 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses ZHS16GBK character set (possible charset conversion)
export client uses ZHS16GBK character set (possible charset conversion)

我现在的操作系统是redhat as 5.1,oracle11.1,原来exp的库是linux as 上oracle10g的库,今天导进来发现中文全部乱码了,请问怎么个解决法?


只看该作者    顶部
离线 hotiice
版主


精华贴数 10
个人空间 0
技术积分 16699 (62)
社区积分 1796 (648)
注册日期 2004-9-9
论坛徽章:21
现任管理团队成员会员2007贡献徽章铁扇公主生肖徽章2007版:牛2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:游泳
设计板块每日发贴之星设计板块每日发贴之星生肖徽章2007版:蛇2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:鼠

发表于 2008-6-25 08:11 
重新导出,导出前确认2个数据库字符集相同


__________________
①②⑧

只看该作者    顶部
离线 new4oracle



精华贴数 0
个人空间 0
技术积分 68 (22264)
社区积分 0 (1773995)
注册日期 2008-5-11
论坛徽章:0
      
      

发表于 2008-6-25 11:17 
重新导出的话,导出前,我怎么设置字符集啊,设置城ZHS16GBK


只看该作者    顶部
离线 new4oracle



精华贴数 0
个人空间 0
技术积分 68 (22264)
社区积分 0 (1773995)
注册日期 2008-5-11
论坛徽章:0
      
      

发表于 2008-6-25 12:04 
我现在用plsql develop打开记录,看到的中文的,但是用sqlplus进去看是乱麻,这个说明,库里面的是中文吗.


只看该作者    顶部
离线 doctor1414c


精华贴数 0
个人空间 0
技术积分 310 (6355)
社区积分 0 (1724048)
注册日期 2008-3-13
论坛徽章:0
      
      

发表于 2008-6-25 14:45 
我发现存中文UTF8也不错
我的建议是:
请查看你的三个字符集设置
1.服务端,不用我说,你肯定知道怎么在数据库里看2
2.客户端,ECHO $NLS_LANG
3.客户端OS,ECHO $LANG
最好三个都一样,实在不行,保证2,3一样


只看该作者    顶部
在线/呼叫 nw5452
笨得可以


精华贴数 0
个人空间 53
技术积分 2229 (708)
社区积分 1187 (856)
注册日期 2007-8-21
论坛徽章:11
授权会员2008年新春纪念徽章生肖徽章2007版:鼠ITPUB新首页上线纪念徽章  
      

发表于 2008-6-25 14:55 
确认client和server端字符集相同,然后重做一遍


__________________
努力学习oracle ing....
新手,如果说错了,请各位高手及时给与纠正!
msn:niwei5452@hotmail.com
QQ:754427774
只看该作者    顶部
离线 hotiice
版主


精华贴数 10
个人空间 0
技术积分 16699 (62)
社区积分 1796 (648)
注册日期 2004-9-9
论坛徽章:21
现任管理团队成员会员2007贡献徽章铁扇公主生肖徽章2007版:牛2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:游泳
设计板块每日发贴之星设计板块每日发贴之星生肖徽章2007版:蛇2008年新春纪念徽章生肖徽章2007版:猴生肖徽章2007版:鼠

发表于 2008-6-25 16:03 
Oracle字符集问题总结
  经常有同事咨询oracle数据库字符集相关的问题,如在不同数据库做数据迁移、同其它系统交换数据等,常常因为字符集不同而导致迁移失败或数据库内数据变成乱码。现在我将oracle字符集相关的一些知识做个简单总结,希望对大家今后的工作有所帮助。
  一、什么是oracle字符集
  Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
  影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下:
  NLS_LANG = language_territory.charset
  它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:
  Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。如:AMERICAN _ AMERICA. ZHS16GBK
  从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
  二、如何查询Oracle的字符集
  很多人都碰到过因为字符集不同而使数据导入失败的情况。这涉及三方面的字符集,一是oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。在做数据导入的时候,需要这三个字符集都一致才能正确导入。
  1、查询oracle server端的字符集
  有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:SQL>select userenv(‘language’) from dual;
  结果类似如下:AMERICAN _ AMERICA. ZHS16GBK
  2、如何查询dmp文件的字符集
  用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:
  SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;
  ZHS16GBK
  如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):
  cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
  然后用上述SQL也可以得到它对应的字符集。
  3、查询oracle client端的字符集
  这个比较简单。在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如:
  set nls_lang=AMERICAN_AMERICA.ZHS16GBK
  这样就只影响这个窗口里面的环境变量。
  在unix平台下,就是环境变量NLS_LANG。
  $echo $NLS_LANG
  AMERICAN_AMERICA.ZHS16GBK
  如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。
  三、修改oracle的字符集
  上文说过,oracle的字符集有互相的包容关系。如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
  一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
  1、修改server端字符集(不建议使用)
  在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:
  $sqlplus /nolog
  SQL>conn / as sysdba;
  若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:
  SQL>STARTUP MOUNT;
  SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
  SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
  SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
  SQL>ALTER DATABASE OPEN;
  SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
  SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
  SQL>SHUTDOWN IMMEDIATE;
  SQL>STARTUP

        SQL> alter database character set zhs16gbk;
        alter database character set zhs16gbk
        *
        ERROR at line 1:
        ORA-12712: new character set must be a superset of old character set
       SQL> ALTER DATABASE character set INTERNAL_USE zhs16gbk;
        SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';
        # 使用INTERNAL_USE可以跳过超集的检查,ALTER DATABASE character set INTERNAL_USE

  2、修改dmp文件字符集
  上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。
  具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:
  SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
  0354
  然后将dmp文件的2、3字节修改为0354即可。
  如果dmp文件很大,用ue无法打开,就需要用程序的方法了。网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好,缺点是比较麻烦)。我在windows下测试通过。但要求oracle数据库一定要安装JVM选项。


__________________
①②⑧

只看该作者    顶部
离线 阿日
2M-Never give up


精华贴数 0
个人空间 495
技术积分 1633 (1032)
社区积分 1123 (882)
注册日期 2004-1-4
论坛徽章:20
ITPUB元老铁扇公主红孩儿2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:马术2008北京奥运纪念徽章:棒球
数据库板块每日发贴之星2008北京奥运纪念徽章:皮划艇激流回旋ERP板块每日发贴之星每日论坛发贴之星行业板块每日发贴之星2008年新春纪念徽章

发表于 2008-6-25 23:14 
版主就是强呀,值得学习


__________________
我欲将心向明月,奈何明月照沟渠.
过去的都过去了,大不了从头再来,别回头,向前看!
http://blog.csdn.net/zxf_feng
只看该作者    顶部
离线 liushihuar



精华贴数 0
个人空间 0
技术积分 465 (4160)
社区积分 90 (3638)
注册日期 2007-8-11
论坛徽章:3
2008北京奥运纪念徽章:田径2008北京奥运纪念徽章:田径2008北京奥运纪念徽章:网球   
      

发表于 2008-6-26 08:46 
回复 #7 hotiice 的帖子

很詳細,學習,謝謝


只看该作者    顶部
离线 gthboy
万事如意


精华贴数 1
个人空间 0
技术积分 1769 (934)
社区积分 2 (29332)
注册日期 2006-6-25
论坛徽章:2
2008北京奥运纪念徽章:柔道     
      

发表于 2008-6-26 19:12 
7楼文章中有个严重的错误

select userenv(‘language’) from dual;

这条语句查出来的不是服务端的字符集设置,我在数据库管理版问过高手了


__________________
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问