一、确认dmp文件、oracle客户端和服务端的字符集
(1)dmp文件字符集确认:
使用UE打开dmp文件查看文件第2个和第3个字节内容,这两个字节记录了dmp文件的字符集。如0354,然后用以下sql查出它对应的字符集:
select nls_charset_name(to_number('0354','xxxx')) from dual;
结果显示为ZHS16GBK,若是使用UE打开不方便,也可使用linux命令查看:cat exp.dmp|od -x|head -1|awk '{print $2$3}'|cut -c 3-6
还可以使用imp命令尝试导入dmp文件,在日志文件或linux界面上可以查看该dmp文件的字符集。
(2)查看oracle 服务端的字符集
使用sql进行查询:select userenv('language') from dual;
结果类似: SIMPLIFIED CHINESE_CHINA.ZHS16GBK
(3)查看oracle客户端的字符集
使用linux命令查看:echo $NLS_LANG
结果类似如下:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
二、根据dmp文件的字符集修改oracle客户端和服务端的字符集
以下的修改以dmp文件的字符集为SIMPLIFIED CHINESE_CHINA.ZHS16GBK为例。
(1)修改oracle客户端字符集
修改/ect/下的profile文件中的:
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
(2)修改oracle服务端的字符集
使用以下sql语句进行修改:
sqlplus /nolog;
conn / as sysdba
shutdown immediate;
startup mount;
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set internal_use ZHS16GBK;
shutdown immediate;
startup;
三、使用imp命令将dmp文件导入oracle数据库
切换到oracle用户,然后使用imp命令导入dmp文件,步骤如下:
su - oracle;
imp user/pwd@ip:1521/实例名 file=/filepath/exp.dmp log=/logpath/implog.log full=y ignore=y
四、使用sqluldr2抽取oracle数据库中的表数据到txt文件
首先安装sqluldr2软件,然后使用sqluldr2抽取oracle表数据到txt文件,具体步骤如下:
打开cmd命令,进入sqluldr2.exe目录
使用以下命令导出数据
sqluldr264.exe user="user/pwd@ip:1521/dbtrain" query= "select * from tablename" field=0x09 record=0x0a file= "E:\out.txt" charset=ZHS16GBK
命令中field为列分隔符,此处0x09为制表符,record为行分隔符,此处0x0a为换行符,具体指令见sqluldr2的帮助。