探索Oracle之 EXP/IMP过程中的字符集问题

1. 问题描述:

数据库之间的数据迁移是一个很常见的作业,EXP/IMP工具是一个常用的数据迁移及转化工具,因其导出文件具有平台无关性,所以在跨平台迁移中,最为常用。但在实际操作过程中,涉及到源数据库,客户端,目标数据库三方面的字符集问题。操作人员对三者之间的字符集转换过程不了解,而冒然使用EXP/IMP命令,往往在迁移过程中报错终止,或是在没有报错的情况下成功导入,但其背后却存在隐患,在查询时经常显示乱码。

2.解决方法

2.1 源端数据库(1)→EXP客户端(2)→IMP客户端(3)→目标数据库(4),数据在迁移过程中要经历如上的4个点,数据在流动过程中(如上的3个箭头)需要依次比较箭头两端的字符集,如果相同则不转换,如果不同则进行转换。如果相邻的两个点之间设置的字符集均不相同,则需要转换3次。

根据上述理论分析,最好的设置方式是,因为(1)(4)数据库的字符集是固定的,则设置客户端的字符集(2)(3)均与(1)相同,这样最多只在(3)→(4)的过程中发生一次字符集的转换。但是前提是(4)的字符集必须是(1)的的字符集的超集。客户端字符集是通过环境变量NLS_LANG来设置。

Linux: export NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK
Windows: set NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK

EXP导出的文件,可以通过WINDOWS上的工具UE来查看,其中第一行的第2,3个字节显示的数字代表了文件的字符集。在sqlplus里通过select
nls_charset_name() from dual;可以查看该数字代表的字符集。

03 03 54 45 58 50 4F 52 54 3A

其中,03 54是16进制的数字,代表了一种字符集。将其转换为10进制为:

SQL> select to_number('0354','xxxx') from dual;
TO_NUMBER('0354','XXXX')
------------------------
                     852
查询852代表的字符集
SQL> select nls_charset_name(852) from dual;
NLS_CHAR
--------
ZHS16GBK

当然还可以逆向操作
SQL> select nls_charset_id('ZHS16GBK') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
                       852

2.2 ORACLE在10g以后的版本中提供了新的迁移工具EXPDP/IMPDP,此工具无需设置客户端字符集,而是由ORACLE自动去识别并完全字符集的转换。这是因为EXPDP/IMPDP并不是完整意义上的客户端,它和EXP/IMP/sqlplus并不完全一样。它只是向oracle传输了一个命令,oracle在内部生成一个任务,文件只能导出在服务器上,而不能像exp/imp一样将文件导出到远程端。但前提依然是,目标数据库的字符集应是源数据库字符集的超集。

其实,在使用exp/imp,expdp/impdp时,并不一定要严格要求目的数据库是源数据库的超集。问题的关键之处在于源端的字符能在目的端找到对应的字符。在不同字符集的数据库传输之前,我们最好通过oracle提供的csscan工具来检查两个字符集之间是否可以转换。

时间: 2024-09-29 16:23:03

探索Oracle之 EXP/IMP过程中的字符集问题的相关文章

【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

[exp/imp]将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 如何将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中(重点,2种方法)? ② 从dmp文件可以获取到哪些信息?如何从dmp文件获取到dmp文件的字符集(重点,N种方法)? ③ 如何从dmp

Oracle中用exp/imp命令参数详解【转】

Oracle中用exp/imp命令参数详解 [用 exp 数 据 导 出]:1  将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中   exp system/[email protected]   rows=y  indexes=y compress=n buffer=65536   feedback=100000full=y  file=d:\daochu.dmp  log=d:\daochulog.txt   owner=(ECC_BIZ,

oracle数据库exp/imp命令详解

转自http://wenku.baidu.com/link?url=uD_egkkh7JtUYJaRV8YM6K8CLBT6gPJS4UlSy5WKhz46D9bnychTPdgJGd7y6UxYtBNhq3IXSGeAP0aABTUlnQcvwJkGm2lyzpcbX544zRG oracle数据库exp/imp命令详解 exp/imp命令详解    exp/imp两个命令可以说是oracle中最常用的命令了.    ORACLE数据库有两类备份方法.第一类为物理备份,该方法实现数据库的完整恢

Oracle数据库exp imp以用户来导出的实例 (转)

http://database.51cto.com/art/201004/196538.htm 以下的文章主要介绍Oracle数据库exp imp按相关的用户来导出导入相关实例,第一步我们要从一台windows服务器 A 上导出关于 Test1 这个用户的所有对象,然后导入到linux服务器 B 上的 Test2用户.(已知Test1密码为Test1passwd 或者用system用户导出也行) 2.B机器上Test2用户不存在,或Test2用户已经存在 两种情况(用户存在相对比较复杂) 如果T

Oracle(exp/imp)导入导出

一.exp本地导出与imp本地导入 直接进入系统命令行运行即可. exp命令:1 exp username/[email protected] file=d:test.dmp full=y2 exp username/[email protected] file=d:test.dmp owner=(ly)3 exp username/[email protected] file= d:test.dmp tables=(grid1,grid2) 1其中一是将Test(与某一数据库对应的oracle

Oracle数据库exp imp以用户来导出的实例 (转)

http://database.51cto.com/art/201004/196538.htm 以下的文章主要介绍Oracle数据库exp imp按相关的用户来导出导入相关实例,第一步我们要从一台windows服务器 A 上导出关于 Test1 这个用户的所有对象,然后导入到linux服务器 B 上的 Test2用户.(已知Test1密码为Test1passwd 或者用system用户导出也行) 2.B机器上Test2用户不存在,或Test2用户已经存在 两种情况(用户存在相对比较复杂) 如果T

oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序

15511477451 原文 oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序? 环境:win7 64位系统.oracle11g数据库 问题描述:在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错.错误提示内容如下. 错误分析: 经过查看警告中给出的日志文件 F:\develop\oracle_data\app\Administrator\cfgtoollog

Oracle中用exp/imp命令快速导入导出数据

from: http://blog.csdn.net/wangchunyu11155/article/details/53635602 [用 exp 数 据 导 出]: 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中   exp system/[email protected] file=d:\daochu.dmp full=y 2 将数据库中system用户与sys用户的表导出   exp system/[email protected

转-【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

原帖地址:http://blog.csdn.net/lihuarongaini/article/details/71512116 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 如何将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中(重点,2种方法)? ② 从dmp文件可以获取到哪些信息?如何从dmp文件获取到dmp文件的字符集(重点,N种方法)? ③ 如何从