dimp時報錯,字串截斷

yanhengdoudou發表於2019-10-21

現象描述

達夢也有自己的邏輯備份工具(dexp dimp )用法和Oracle 類似,詳細用法可以參考官方手冊dexp&dimp.pdf

但是,我們有時候在進行dimp 時,會碰到字串截斷的問題。

 

碰到這種問題,我們怎麼解決呢?

 

受限我們一定要非常明確,字串截斷這個報錯,一定就只是精度不足,這裡只是針對兩種可能的情況的,描述下該問題。

 

只需要考慮兩個問題:

Ø   是否表結構不一致,就是dexp 的表,是varchar 500 ),我們匯入的表只是varchar 400

這種情況少,因為有時候我們經常是全使用者新建匯入,表結構也是源端帶入過來的。

Ø   Dexp 源端的資料庫例項字符集,是否和dimp 目的端資料庫例項的字符集一致

這個是我們可能沒有注意的問題。

處理方法

處理方法一:核查表結構是否一致

 

是否表結構不一致,就是dexp 的表,是varchar 500 ),我們匯入的表只是varchar 400

 

這個問題好理解,就是字面意思,我們只需要把目的表的精度改成和源端一致,重新清空目的表,再匯入即可。

 

處理方法二:核查資料庫例項字符集

 

我們碰到這個問題的時候,實際上就是我們從UTF-8 的資料庫例項上dexp 出來的資料庫,往GB18030 的資料庫例項上dimp ,才會碰到這個問題。

 

預設情況下,達夢資料庫例項的varchar 欄位的精度,表示的含義是位元組,而對於漢字而言,在UTF-8 編碼下的位元組佔用,是比GB18030 編碼下的位元組佔用,要大。

所以反過來說,對於dexp&dimp 搬過來的表結構,都是一致的情況下,比如:都是varchar 400 ),可以存放的漢子個數,是不一樣的。

 

備註:

-           對於同一專案內的資料庫例項、可能需要互相進行資料傳遞的例項之間,務必把資料庫底層引數(含字符集)規劃並切實設定成一致!

-           同一專案內的資料庫例項,請務必保持一致、非同一專案內,有資料傳遞需求,但是相關性不搞,且確實不能保持一致的字符集,可以通過手動放大目的端資料庫例項上的varchar 欄位精度。為什麼可以這樣處理,方法二中已經說明。

 

這是一個把資料庫例項中目標表中的所有varchar 欄位,精度放大一倍的指令碼(當成SQL 執行):通過控制遊標查出來的表即可。

declare

begin

for rs in(

select sch.name sch,tab.name tab,col.name   col,COl.length$ len from sysobjects sch,sysobjects tab ,syscolumns col

where sch.id=tab.schid and   sch.name||'.'||tab.name in (

'USER.TABUTKMONITOR',

'USER.TABUTHORIZATIONRISKLOG',

'USER.TABUSTOMER',

'USER.TABARD',

'USER.TABOSSREPORT',

'USER.TABUDGETENTITYCARDS',

'USER.TABRANSACTIONLOG',

'USER.TABCCOUNT',

'USER.TABSTOMERINFO',

'USER.TABRANSACTIONLOG',

'USER.TABUTHORIZATIONRISKLOG'

)

and tab.id=col.id and col.TYPE$ in   ('VARCHAR','VARCHAR2') ) loop

declare

begin

 execute immediate 'alter table   "'||rs.sch||'"."'||rs.tab||'" modify '||rs.col||'   varchar('||rs.len*2||');';

exception when others then

 print(sqlerrm);

end;

end loop;

end;


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

相關文章