您好,登錄后才能下訂單哦!
達夢也有自己的邏輯備份工具(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; |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。