雙位元組中文字符集匯出的DMP檔案匯入UTF8字符集
我們先來做個實驗:
D:>sqlplus /nolog
SQL*Plus: Release 8.1.7.0.0 - Production on 星期一 3月 28 15:02:56 2005
(c) Copyright 2000 Oracle Corporation. All rights reserved.
SQL> connect
已連線。
SQL> select *
2 from v$nls_parameters;
PARAMETER VALUE
----------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY RMB
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_CHARACTERSET ZHS16GBK
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 TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY RMB
NLS_NCHAR_CHARACTERSET ZHS16GBK
NLS_COMP BINARY
已選擇17行。
SQL> select status from alac_accounting_periods
2 where rownum=1;
STATUS
--------------------
關閉
SQL> select dump(status) from alac_accounting_periods
2 where rownum=1;
DUMP(STATUS)
-----------------------------------------------------------------------
Typ=1 Len=4: 185,216,177,213
這裡我們看出,字串“關閉”在ZHS16GBK字符集中佔用了4個位元組。
SQL> connect
已連線。
SQL> select *
2 from v$nls_parameters;
PARAMETER VALUE
----------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY RMB
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_CHARACTERSET UTF8
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 TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY RMB
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
已選擇19行。
SQL> select status from alac_accounting_periods
2 where rownum=1;
STATUS
------------------------------------------------------------
關閉
SQL> select dump(status) from alac_accounting_periods
2 where rownum=1;
DUMP(STATUS)
-----------------------------------------------------------------------
Typ=1 Len=6: 229,133,179,233,151,173
這裡可以看出,相同的字串,在UTF8字符集裡佔用了6個位元組。
我們可以預測,如果將ZHS16GBK的資料進行匯出,並且匯入UTF8字符集的話,則有可能原先可以儲存在ZHS16GBK字符集下的字串因為實際佔用位元組增加而超過列定義的大小,導致匯入失敗。
Oracle提供了一個檢測字符集衝突的工具csscan:
利用這個工具可以檢查出那些資料在進行字符集轉換時可能會出問題。這裡不再祥述。
繼續我們的實現,看看是否會出現剛才預測的問題。在匯入的過程中確實出現了錯誤:
IMP-00019: 行被拒絕是因為 ORACLE 錯誤1401
IMP-00003: ORACLE 錯誤1401出現
ORA-01401: 插入的值對於列過大
列 1 012
列 2 E54
列 3
列 4 05-20
列 5 200405
列 6 1
列 7 14005
列 8 B747-200F
列 9 52155.58
列 10 52155.58
列 11 外航新開帳單
列 12
再看看這個:
SQL> desc ALAC_ACCA_CR_SNAP
名稱 空? 型別
----------------------------------------- -------- --------------
開帳公司 VARCHAR2(20)
被開帳公司 VARCHAR2(20)
航站 VARCHAR2(3)
帳單號 VARCHAR2(30)
外航清算月 VARCHAR2(50)
序號 NUMBER
服務專案 VARCHAR2(15)
機型 VARCHAR2(10)
帳單金額 NUMBER
接受金額 NUMBER
CASE VARCHAR2(12)
SNAP_MONTH VARCHAR2(6)
我們發現第11列,即CASE列的大小為12,如果在兩位元組字符集中,剛好能夠儲存,但在匯入UTF8時將會出錯。
ORACLE官方的解決方案是:利用csscan來查詢,然後更改表的定義。但是這個方法比較麻煩。有沒有簡單點的方法,對DMP檔案動動手腳,讓他能夠匯入呢?
既然是由於列定義大小過小而導致此問題,那麼應該可以修改DMP檔案中CREATE TABLE SQL中對於字串列定義的大小,從而能夠直接匯入修改後的DMP檔案。
常用的字串型別有:Varchar2,Nvarchar2,char等,在本例中,中文字元都儲存在varchar2型別中,所以只需對varchar2進行處理。我們需要讀取DMP檔案中varchar2大小T,然後將T*2/3向上取整後的數字寫回DMP檔案即可。這裡附加上我用Delphi寫的處理程式。
相關工具下載:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19423/viewspace-794183/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 修改exp 的 匯出dmp檔案的字符集
- 查詢dmp檔案(exp方式匯出) 字符集
- 從Export DMP檔案看匯出字符集(上)Export
- 從Export DMP檔案看匯出字符集(下)Export
- 檢視較小dmp檔案,匯出時客戶端的字符集客戶端
- Oracle如何使用spool匯出utf8字符集的文字檔案Oracle
- oracle匯入dmp檔案Oracle
- 識別exp匯出檔案所用的字符集
- Export/Import匯入匯出時的字符集問題ExportImport
- plsql Oracle匯入dmp檔案SQLOracle
- 如何根據exp匯出檔案確定client端匯出時的字符集client
- 【exp/imp】將US7ASCII字符集的dmp檔案匯入到ZHS16GBK字符集的資料庫中ASCII資料庫
- exp匯出檔案時 字符集設定問題
- oracle匯出dmp檔案的2種方法Oracle
- oracle匯入dmp檔案的2種方法Oracle
- MySQL匯入匯出檔案檔案MySql
- oracle匯入dmp檔案win10怎麼操作_win10系統oracle如何匯入dmp檔案OracleWin10
- 字符集例子-同一字元不同字符集編碼不同及匯入匯出的亂碼字元
- 採用exp匯入zhs16gbk雙位元組字元到utf8三位元組字元字元
- ORACLE在UNIX、LINUX系統中匯出、匯入時最好保持匯出、匯入系統的字符集一致OracleLinux
- (十一)Electron 匯入匯出檔案
- mysql 匯入匯出 sql檔案MySql
- MySQL匯入匯出平面檔案MySql
- 如何確定一個dmp檔案是exp匯出的還是expdp匯出的?
- EasyExcel完成excel檔案的匯入匯出Excel
- 轉_oracle的字符集_源於多位元組字符集Oracle
- 華表Cell檔案匯入匯出
- [Docker核心之容器、資料庫檔案的匯入匯出、容器映象的匯入匯出]Docker資料庫
- OracleDatabase——資料庫表空間dmp匯出與匯入OracleDatabase資料庫
- Navicat如何匯入和匯出sql檔案SQL
- 檢視dmp檔案是exp還是expdp匯出來的
- 如何使用JavaScript匯入和匯出Excel檔案JavaScriptExcel
- ubuntu 下mysql匯入和匯出.sql檔案UbuntuMySql
- MySQL 匯出匯入二進位制檔案MySql
- 一個ORACLE匯入和匯出XML檔案的例子OracleXML
- 使用xml檔案,做資料的匯入,匯出 (轉)XML
- 【ASK_ORACLE】一眼判斷出Oracle的dmp檔案是用expdp匯出還是exp匯出Oracle
- mysql 5 資料庫匯出與字符集的問題。MySql資料庫