字符集為ZHS16GBK的資料庫匯入到字符集為AL32UTF8的資料庫

楊奇龍發表於2011-03-11
相信大家都對字符集有相當的瞭解了,廢話就不多說了!直接步入正題:這裡主要是測試含有 漢字的資料從ZHS16GBK的資料庫匯入到字符集為AL32UTF8

資料庫. 如有我沒想到的其他情況,請大家提建議,我繼續完善測試實驗。
測試環境:
目標庫:英傑的rac測試庫 由
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
sys@rac1>select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------
AMERICAN_AMERICA.AL32UTF8

yang@rac1>select * from nls_database_parameters;
PARAMETER                 VALUE
------------------------- ----------------------------------------
NLS_LANGUAGE              AMERICAN
NLS_TERRITORY             AMERICA
NLS_CURRENCY              $
NLS_ISO_CURRENCY          AMERICA
NLS_NUMERIC_CHARACTERS    .,
NLS_CHARACTERSET          AL32UTF8
NLS_CALENDAR              GREGORIAN
NLS_DATE_FORMAT           DD-MON-RR
NLS_DATE_LANGUAGE         AMERICAN
NLS_SORT                  BINARY
NLS_TIME_FORMAT           HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT      DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT        HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT   DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY         $
NLS_COMP                  BINARY
NLS_LENGTH_SEMANTICS      BYTE
NLS_NCHAR_CONV_EXCP       FALSE
NLS_NCHAR_CHARACTERSET    AL16UTF16
NLS_RDBMS_VERSION         11.2.0.1.0

20 rows selected.

源庫:
Release 11.1.0.6.0 - Production on Friday, 11 March, 2011 21:11:49
Conneted to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
源庫的nls_ 資訊:
sys@ORACL> select * from nls_database_parameters;
PARAMETER                 VALUE
------------------------- --------------------------------------------------
NLS_LANGUAGE              AMERICAN
NLS_TERRITORY             AMERICA
NLS_CURRENCY              $
NLS_ISO_CURRENCY          AMERICA
NLS_NUMERIC_CHARACTERS    .,
NLS_CHARACTERSET          ZHS16GBK
NLS_CALENDAR              GREGORIAN
NLS_DATE_FORMAT           DD-MON-RR
NLS_DATE_LANGUAGE         AMERICAN
NLS_SORT                  BINARY
NLS_TIME_FORMAT           HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT      DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT        HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT   DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY         $
NLS_COMP                  BINARY
NLS_LENGTH_SEMANTICS      BYTE
NLS_NCHAR_CONV_EXCP       FALSE
NLS_NCHAR_CHARACTERSET    AL16UTF16
NLS_RDBMS_VERSION         11.1.0.6.0

測試步驟:這裡主要是測試含有 漢字的資料從ZHS16GBK 匯入到 AL32UTF8 .
在源庫建立含有漢字的表:
yang@ORACL> create table chart ( val varchar2(20));
表已建立。
======建立英文字元資料
yang@ORACL> insert into chart
  2  select dbms_random.string('l',15)
  3  from dual
  4  connect by level <50;
已建立49行。
======建立中文漢字資料
yang@ORACL> insert into chart
  2  select '阿里雲' as val from
  3  dual connect by level <50;
已建立49行。
yang@ORACL> select * from chart;

VAL
--------------------
ogqodcrhyqaesks
zifjvopjwwvydjf
oaosnvrzjazdmju
ihpjfwpgzxlbosn
igimjnzkjbaiivf
jxqmgavtpfmlphf
izgrniqmuejiysb
cydqjrbjldnsucq
sikpsorziznhyly
bxstvwdqrqmnylp
ziveucwqsjbmlpu
qdhdwjoxthivxoe
dqideijubqlzeel
qtuyuiwnjigrqcj
gzgamguukwgogib
ufrnfcdtcnmxatg
rpuhrxfzzwmajec
kqsawluuwltmdbf
mlkfeymlhbqsrwj
fokunjivnccjhls
drlkbryvpklhlst
vaigghwmwspounp
qpdslsjqszpasgg
cevwjirdyowhzep
gpktcxauilvpjym
oyrrpyxlroflksp
hqfctsysbpnzkfi
ufcqglfwqgvuwdv
nhloooihrndmrcu
grrtelwqpgnmazw
olzmdcotmziiphj
fmohaagtultvxon
lwsqzgofvhgzajm
vcdeoomgsrzfvjr
pzpfqhpenensoij
nbvxphjkufcvxmj
ydfknwhpnzzpvsw
xzhooomfumuckdc
rohspaowywmblti
dhjctrkkrdlyhvr
yzevspqkpuumjzh
xqmdpotvouvzgzl
rnvcrercdxybwlt
zhbdhamarftudbr
biykwlracluonab
hsdpycatadxhpft
wskchunnmvkbprh
butuurwduseffzc
fosmnbjannddffp
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲

已選擇98行。
yang@ORACL> commit;
提交完成。
yang@ORACL> select dump('阿里雲') from dual;
DUMP('阿里雲')
-------------------------------------
Typ=96 Len=6: 176,162,192,239,212,198 ===三個 漢字 佔用6個位元組
===================匯出操作===================================
Microsoft Windows [版本 6.1.7600]
版權所有 (c) 2009 Microsoft Corporation。保留所有權利。
C:\Users\aaaa>set nls_lang=american_america.al32utf8 這裡後面測試不加也可以成功匯入al32utf8
C:\Users\aaaa>expdp yang/yang tables=chart directory=dumpdir  dumpfile=zhs16gbk.dmp
Export: Release 11.1.0.6.0 - Production on Friday, 11 March, 2011 21:19:04
Copyright (c) 2003, 2007, Oracle.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "YANG"."SYS_EXPORT_TABLE_01":  yang/******** tables=chart directory=dumpdir dumpfile=zhs16g
bk.dmp
Estimate in progress using BLOCKS method...
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 64 KB
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported "YANG"."CHART"                              6.484 KB      98 rows
Master table "YANG"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for YANG.SYS_EXPORT_TABLE_01 is:
  D:\DUMP\ZHS16GBK.DMP
Job "YANG"."SYS_EXPORT_TABLE_01" successfully completed at 21:19:20
==============================匯入到目標庫=========================================
oracle@rac1:rac1 /tmp/dump>export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 ==.bash_profile 檔案裡已經宣告瞭,這裡是強調一下。
oracle@rac1:rac1 /tmp/dump>impdp yang/yang tables=chart directory=dumpdir dumpfile=zhs16gbk.dmp log=zhs16gbk_to_al32utf8.log
Import: Release 11.2.0.1.0 - Production on Fri Mar 11 21:23:13 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
Legacy Mode Active due to the following parameters:
Legacy Mode Parameter: "log=zhs16gbk_to_al32utf8.log" Location: Command Line, Replaced with: "logfile=zhs16gbk_to_al32utf8.log"
Master table "YANG"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded
Starting "YANG"."SYS_IMPORT_TABLE_01":  yang/******** tables=chart directory=dumpdir dumpfile=zhs16gbk.dmp

logfile=zhs16gbk_to_al32utf8.log
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "YANG"."CHART"                              6.484 KB      98 rows
Job "YANG"."SYS_IMPORT_TABLE_01" successfully completed at 21:23:17

==============================在目標庫中驗證=======================================
sys@rac1>select dump('阿里雲') from dual;
DUMP('阿里雲')
-------------------------------------------------
Typ=96 Len=9: 233,152,191,233,135,140,228,186,145  阿里雲 三個漢字 佔用 9個位元組。

yang@rac1>select table_name from user_tables;
TABLE_NAME
------------------------------
CHARSET
CHART
yang@rac1>select val from chart;
VAL
----------------
ogqodcrhyqaesks
zifjvopjwwvydjf
oaosnvrzjazdmju
ihpjfwpgzxlbosn
igimjnzkjbaiivf
jxqmgavtpfmlphf
izgrniqmuejiysb
cydqjrbjldnsucq
sikpsorziznhyly
bxstvwdqrqmnylp
ziveucwqsjbmlpu
qdhdwjoxthivxoe
dqideijubqlzeel
qtuyuiwnjigrqcj
gzgamguukwgogib
ufrnfcdtcnmxatg
rpuhrxfzzwmajec
kqsawluuwltmdbf
mlkfeymlhbqsrwj
fokunjivnccjhls
drlkbryvpklhlst
vaigghwmwspounp
qpdslsjqszpasgg
cevwjirdyowhzep
gpktcxauilvpjym
oyrrpyxlroflksp
hqfctsysbpnzkfi
ufcqglfwqgvuwdv
nhloooihrndmrcu
grrtelwqpgnmazw
olzmdcotmziiphj
fmohaagtultvxon
lwsqzgofvhgzajm
vcdeoomgsrzfvjr
pzpfqhpenensoij
nbvxphjkufcvxmj
ydfknwhpnzzpvsw
xzhooomfumuckdc
rohspaowywmblti
dhjctrkkrdlyhvr
yzevspqkpuumjzh
xqmdpotvouvzgzl
rnvcrercdxybwlt
zhbdhamarftudbr
biykwlracluonab
hsdpycatadxhpft
wskchunnmvkbprh
butuurwduseffzc
fosmnbjannddffp
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
阿里雲
98 rows selected.

小結:字符集子集向其超集轉換是可行的,如此例 ZHS16GBK轉換為AL32UTF8。
匯出使用的字符集將會記錄在匯出檔案中,當檔案匯入時,將會檢查匯出時使用的字符集設定,如果這個字符集不同於匯入客戶端的NLS_LANG
設定,字符集將根據匯入客戶端NLS_LANG設定進行轉換,如果必要,在資料插入資料庫之前會進行進一步轉換。
通常在匯出時最好把客戶端字符集設定得和資料庫端相同,這樣可以避免在匯出時發生不必要的資料轉換,匯出檔案將和資料庫具有相同的字符集。
即使將來會把匯出檔案匯入到不同字符集的資料庫中,這樣做也可以把轉換延緩至匯入時刻。

當進行資料匯入時,主要存在以下兩種情況:
1.源資料庫和目標資料庫具有相同字符集設定
這時,只需要設定NLS_LANG等於資料庫字符集即可匯入(前提是,匯出使用的是和源資料庫相同字符集,即三者相同)

2.源資料庫和目標資料庫字符集不同
如果我們匯出時候使用的NLS_LANG是和源資料庫相同的字符集,那麼匯入時就可以設定客戶端NLS_LANG等於匯出時使用的字符集,這
樣轉換隻發生在資料庫端,而且只發生一次。

例如:
如果進行從ZHS16GBK到UTF8的轉換
1)使用NLS_LANG=AMERICAN_AMERICA.ZHS16GBK匯出資料庫。
這時建立的匯出檔案包含ZHS16GBK的資料
2)匯入時使用NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
這時轉換僅發生在insert資料到UTF8的資料庫中。

以上假設的轉換隻在目標資料庫字符集是源資料庫字符集的超集時才能轉換。
參考文章:
http://www.itpub.net/thread-538197-1-1.html
http://www.itpub.net/viewthread.php?tid=276524&extra=page%3D1&page=1


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

相關文章