暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

记一次oracle中导入dmp字符乱码分析和解决方案

软件实施干货分享 2020-04-16
1354
一、问题描述:
我新建了一个oracle数据库,从老库中导出数据为dmp文件,然后导入新库中,出现中文乱码问题。

出现中文乱码的主要原因是字符集不同,所以在oracle中出现乱码问题,不要着急,我们主要关心以下这三个地方的字符集,处理好了字符集问题,乱码问题就迎刃而解了。

一是oracel server端的字符集
二是oracle client端的字符集
三是dmp文件的字符集
在做数据导入的时候,保证这三个字符集都一致才能正确导入。
二、解决办法:
由于我的dmp文件字符集和oracle服务端的字符集完全一致,所以我通过修改oracle client端的字符集解决了我自己的问题,具体操作见下方描述。

1、查看Oracle客户端字符集:

SELECT * FROM V$NLS_PARAMETERS;--返回当前用户环境中设置的字符集
SELECT USERENV('language'FROM DUAL;--返回当前会话使用的字符
复制

2、查看Oracle服务端字符集:

SELECT * FROM NLS_DATABASE_PARAMETERS;--返回Oracle server端的字符集,来源于props$,是表示数据库的字符集
复制

3、查看dmp文件的字符集:

  用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

select nls_charset_name(to_number('0354','xxxx')) from dual;”
复制

   如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):

 “cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
复制

       然后用上述SQL也可以得到它对应的字符集,根据查询到的字符集结果和们的实际情况对字符集进行修改,即可解决乱码问题。

服务器端字符集修改:

一旦数据库创建后,数据库的字符集理论上讲是不能改变的,这里不建议对服务器端字符集进行改变,如果要修改请自行百度。
客户端字符集修改:

计算机->属性->高级系统设置->环境变量->新建

设置变量名:NLS_LANG,变量值:服务器端查到的值, 我的是 AMERICAN_AMERICA.ZHS16GBK

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无法打开,就需要用程序的方法了,在此不再讨论


文章转载自软件实施干货分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论