oracle字符集深入研究(二)

2014-11-24 11:49:01 · 作者: · 浏览: 1
uses WE8ISO8859P1 character set (possible charset conversion)
export client uses WE8ISO8859P1 character set (possible charset conversion)
. importing SCOTT's objects into SCOTT

这是怎么回事呢?

答案是字符集不一致,import done 代表的导出该文件时设置的客户端字符集信息也 就是NLS_LANG,如果字符集不一致那么就会进行转换。

查看如下:

[oracle@tf lbuilder]$ export NLS_LANG=AMERICAN_AMERICA.US7ASCII
[oracle@tf lbuilder]$ exp system/root file=us.dmp owner=scott rows=y

Export: Release 10.2.0.1.0 - Production on Wed Dec 4 07:16:33 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)

About to export specified users ...
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user SCOTT 
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user SCOTT 
About to export SCOTT's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions

当我们在进行导入的时候就出现了上边导入字符集转换的问题。

那么如何查看exp导出文件的字符集呢?字符集信息存在导出文件头的第2和第3个字节处,对于expdp会在dmp文件中写入字符集以及语言和区域信息如下:

[oracle@tf lbuilder]$ cat us.dmp | od -X |head -2
0000000 45010003 524f5058 31563a54 32302e30
0000020 0a31302e 53595344 0a4d4554 45535552

可以通过转化获得如下:

[oracle@tf lbuilder]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Dec 4 07:20:19 2013

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select nls_charset_name(1) from dual;

NLS_CHAR
--------
US7ASCII

SQL>

在客户端设置不同的NLS_LANG字符集会有不同的显示结果:

[oracle@tf lbuilder]$ export NLS_LANG=AMERICAN_AMERICA.US7ASCII
[oracle@tf lbuilder]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Dec 4 07:23:15 2013

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select sysdate from dual;

SYSDATE
---------
04-DEC-13

SQL> exit

[oracle@tf lbuilder]$ export NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
[oracle@tf lbuilder]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on l 12 4 07:24:52 2013

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select sysdate from dual;

SYSDATE
--------------
04-12 -13

SQL>

这里有两个问题export NLS_LANG=AMERICAN_AMERICA.US7ASCII其中amercan代表使用的语言,america代表所属地域,后边US7ASCII代表字符集

在显示的时候出现了一个?说明在显示的时候进行字符转换。下面讨论一下:

第一,NLS_LANG字符集和数据库字符集不相同。

那么当输入数据的时候字符的显示需要依靠客户端的应用字符集,但是导入数据库的时候需要通过nls_lang进行字符集转换,完了之后再将nls_lang转换后的字符集在在数据库中进行转换,如果数据库字符集不是nls_lang字符集的超集那么就会存在映射错误导致破坏了原始数据。当然,在转换过程中如果在数据库中得不到nls_lang转换后的编码映射关系则会有?代替其字符存入数据库。刚刚显示?也是一个逆向的转换过程。

第二:当nls_lang字符集和数据库字符集相同

那么这个时候直接将输入的字符通过nls-lang编码以后直接存与数据库中,不会在数据库 在进行进一步的转换。

那么这就存在一个注意地方,在进行数据库数据导入导出的时候最好设置NLS_LANG等于数据库的字符集,一个是加快导入速度,另一是避免导入数据的完整性。

那么当进行跨平台导入导出的时候,涉及到字符集转换,那么怎么确保哪些数据字符集在映射中存在问题