如何根據exp匯出檔案確定client端匯出時的字符集

warehouse發表於2011-03-10
其實確定就是nls_lang中提到的字符集,和db server的字符集無關[@more@]

client exp匯出時的nls_lang值如下:
NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
--====================================
C:>exp test/test file=c:tempa.dmp tables=t

Export: Release 10.2.0.1.0 - Production on 星期四 3月 10 09:46:20 2011

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


連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即將匯出指定的表透過常規路徑...
. . 正在匯出表 T匯出了 0 行
成功終止匯出, 沒有出現警告。

C:>exp test/test file=c:tempa.dmp tables=t

Export: Release 10.2.0.1.0 - Production on 星期四 3月 10 09:47:06 2011

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


連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即將匯出指定的表透過常規路徑...
. . 正在匯出表 T匯出了 2 行
成功終止匯出, 沒有出現警告。

C:>
--======================================
--透過ultraedit開啟a.dmp檔案:
發現第2個和第3個位元組是:03 54
按照網上流傳的一個說法(之所以這麼說,因為自己麼有在doc中看到過,汗)這2個位元組代表就是exp時client端nls_lang中的client字符集
--==========================
SQL> select to_number('0354','xxxx') from dual;

TO_NUMBER('0354','XXXX')
------------------------
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

SQL>
SQL> select nls_charset_name(936) from dual;

N
-


SQL>
--這裡有個小小的疑問,windows下我們看到的程式碼936對應的是簡體中文 GBK,貌似和
oracle中的852不一致,肯定指的都是簡體中文,莫非2個地方的id不同?另外貌似沒有oracle檢視記錄charset name和id的對應關係...?
--=======================
知道了exp匯出時client端的字符集,那麼我們在匯入時也設定成這樣的字符集(當然最終
都得和db server的字符集保持一致),匯入之後才有可能不至於產生亂碼。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1047080/,如需轉載,請註明出處,否則將追究法律責任。

相關文章