网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.Oracle数据库技术(2).
.教你快速掌握解决RMAN-06026错误.
.Sql*plus技巧之SPOOL应用.
.Oracle数据库PL/SQL过程调试的输.
.怎么样做到限时登录.
.Oracle与Access表之间的导入和导.
..NET中用Oracle 10g Single-Sign.
.Oracle中构建基于VPD特性的安全数.
.抛砖引玉 -- 对集合的整理资料.
.Oracle9i自动分段空间管理改善分.
.为什么有时 Oracle 数据库不用索.
.一个Oracle数据库链接的JavaBean.
.如何找出磁盘中某个大小范围内的.
.关于oracle 10G企业网格计算的介.
.Oracle产品中的错误的诊断.
.Oracle学习手册:Oracle游标使用.
.ORACLE常用傻瓜问题1000问(之六).
.实用心得:Oracle中监控索引的使.
.Oracle数据库9i在AIX环境下的性能.
.如何在Oracle/2000中调用Windows.

Oracle的imp命令导入备份数据

发表日期:2008-2-9


     笔者在做项目过程中碰到以下问题,在客户提供的数据库备份文件需要导入到数据库中,以便使用,数据库为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.dmp
Import: 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 - Production
JServer Release 9.0.1.1.1 - Production
IMP-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
--------------
JA16EUC
SQL> select nls_charset_name(852) from dual;
NLS_CHARSET_NAME
----------------
ZHS16GBK
SQL> 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.UTF8
SQL>
用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'))
--------------------------------------------------------------------------------
ZHS16GBK
SQL>
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文件中备份的数据库表已经存在,则导入过程会失败,只能先将已经存在的表删除,在进行导入。 Trackback: http://tb.blog.csdn.net/TrackBack.ASPx?PostId=1490297
上一篇:Oracle数据库中如何改善表空间的管理 人气:696
下一篇:清除Oracle中无用索引 改善DML性能 人气:867
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐