imp导入数据oracle,怎样用Oracle的imp命令导入备份数据?

笔者在做项目过程中遇到以下问题,在客户提供的数据库备份文件需要导入到数据库中,以便使用,数据库为Oracle 9。1。1,安装在Windows Server 2000 JP系统中,服务器端字符集 为JAPANESE_JAPAN_UTF8,而客户端使用的是中文Windows Server 2000系统,字符集为SIMPLIFIED CHINESE_CHINA。

ZHS16GBK。在插入数据过程中出现如下问题:C:\oracle\ora90\BIN>imp scott/tiger@SDES full=y file=c:\expdat。dmpImport: Release 9。0。1。1。1 - Production on 星期一 1月 22 19:05:43 2007(c) Copyright 2001 Oracle Corporation。

All rights reserved。连接到: Oracle9i Release 9。0。1。1。1 - ProductionJServer Release 9。0。1。1。1 - ProductionIMP-00016: 不支持要求的字符集转换(从类型830到852)IMP-00000: 未成功终止导入使用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获取该字符集的编号: 笔者遇到的问题为830到852类型转换错误,进入Oracle的sqlplus,进行以下查询:SQL> select nls_charset_name(830) from dual;NLS_CHARSET_NA--------------JA16EUCSQL> select nls_charset_name(852) from dual;NLS_CHARSET_NAME----------------ZHS16GBKSQL>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字符集的数据库就可以了。

影响oracle数据库字符集最重要的参数是NLS_LANG参数。它的格式如下: NLS_LANG = language_territory。charset 。它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中: Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。

如:AMERICAN _ AMERICA。 ZHS16GBK 。可以使用以下命令获取字符集名称:SQL> select userenv('language') from dual;USERENV('LANGUAGE')-------------------------------------------------------------------------------SIMPLIFIED CHINESE_CHINA。

UTF8SQL>用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;NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX'))--------------------------------------------------------------------------------ZHS16GBKSQL>03 03 3e 45 。

。。。。其中的033e就是字符集对应的值。上文说过,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文件中备份的数据库表已经存在,则导入过程会失败,只能先将已经存在的表删除,在进行导入。

以上是我对于这个问题的解答,希望能够帮到大家。

全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值