達夢也有自己的邏輯備份工具(dexp 、dimp )用法和Oracle 類似,詳細用法可以參考官方手冊dexp&dimp.pdf
博羅ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
但是,我們有時候在進行dimp 時,會碰到字符串截斷的問題。
碰到這種問題,我們怎么解決呢?
受限我們一定要非常明確,字符串截斷這個報錯,一定就只是精度不足,這里只是針對兩種可能的情況的,描述下該問題。
只需要考慮兩個問題:
? 是否表結(jié)構(gòu)不一致,就是dexp 的表,是varchar (500 ),我們導(dǎo)入的表只是varchar (400 )
這種情況少,因為有時候我們經(jīng)常是全用戶新建導(dǎo)入,表結(jié)構(gòu)也是源端帶入過來的。
? Dexp 源端的數(shù)據(jù)庫實例字符集,是否和dimp 目的端數(shù)據(jù)庫實例的字符集一致
這個是我們可能沒有注意的問題。
處理方法一:核查表結(jié)構(gòu)是否一致
是否表結(jié)構(gòu)不一致,就是dexp 的表,是varchar (500 ),我們導(dǎo)入的表只是varchar (400 )
這個問題好理解,就是字面意思,我們只需要把目的表的精度改成和源端一致,重新清空目的表,再導(dǎo)入即可。
處理方法二:核查數(shù)據(jù)庫實例字符集
我們碰到這個問題的時候,實際上就是我們從UTF-8 的數(shù)據(jù)庫實例上dexp 出來的數(shù)據(jù)庫,往GB18030 的數(shù)據(jù)庫實例上dimp ,才會碰到這個問題。
默認情況下,達夢數(shù)據(jù)庫實例的varchar 字段的精度,表示的含義是字節(jié),而對于漢字而言,在UTF-8 編碼下的字節(jié)占用,是比GB18030 編碼下的字節(jié)占用,要大。
所以反過來說,對于dexp&dimp 搬過來的表結(jié)構(gòu),都是一致的情況下,比如:都是varchar (400 ),可以存放的漢子個數(shù),是不一樣的。
備注:
- 對于同一項目內(nèi)的數(shù)據(jù)庫實例、可能需要互相進行數(shù)據(jù)傳遞的實例之間,務(wù)必把數(shù)據(jù)庫底層參數(shù)(含字符集)規(guī)劃并切實設(shè)置成一致!
- 同一項目內(nèi)的數(shù)據(jù)庫實例,請務(wù)必保持一致、非同一項目內(nèi),有數(shù)據(jù)傳遞需求,但是相關(guān)性不搞,且確實不能保持一致的字符集,可以通過手動放大目的端數(shù)據(jù)庫實例上的varchar 字段精度。為什么可以這樣處理,方法二中已經(jīng)說明。
這是一個把數(shù)據(jù)庫實例中目標表中的所有varchar 字段,精度放大一倍的腳本(當成SQL 執(zhí)行):通過控制游標查出來的表即可。
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; |