2014-03-05 116 views
2

我正在使用MLOAD將數據從Oracle中提取到Teradata中。它已被證明是一場噩夢,因爲Oracle表包含Teradata Unicode列不接受的各種字符。在MLOAD運行後查詢生成的ET_表以查看哪些列失敗時,不支持的字符最終變爲�。當我使用ASCII()函數在Oracle端追蹤這些字符時,我得到的數字爲160(顯然是非破壞性空間),15712189(替換字符)和15556979(在Google中任何地方都沒有顯示)。如何將不支持的字符加載到Teradata Unicode列中?

有太多不支持的字符,我不能硬編碼所有。我需要以某種方式讓我的MLOAD腳本去掉Unicode列不支持的任何字符。

回答

1

不再適用的漢字不是問題:

這可能是,你必須使用TRANSTLATE()函數的情況:

SELECT TRANSLATE({colA} 
      USING {KANJISJIS_TO_UNICODE|KANJI1_SBC_TO_UNICODE|KANJI1_KANJISJIS_TO_UNICODE 
        |KANJI1_KanjiEUC_TO_UNICODE|KANJI1_KanjiEBCDIC_TO_UNICODE} 
       ); 

不支持的字符: 如果您在Teradata 14上可以使用正則表達式函數之一來替換超出LATIN或UNICODE範圍的數據,並使用空字符串:

SELECT REGEXP_REPLACE({colA}, '[^[print]]', '') FROM {MyDB}.{MyTable}; 

您還可以在您的處置中的Teradata 14還可以用來剔除掉有問題的數據CHR()函數:

SELECT CASE WHEN POSITION(CHR(26) IN {ColA}) = 0 
      THEN {ColA} 
      ELSE SUBSTRING({ColA} FROM 1 FOR 
       (POSITION(CHR(26) IN {ColA}) - 1)) 
       || '' || SUBSTRING({ColA} FROM 
       (POSITION(CHR(26) IN {ColA}) + 1)) 
     END AS Test_ 
FROM {MyDB}.{MyTable}; 

在它工作的單個事件上面的例子「壞」數據。如果您在單個字符串中重複出現,則可能需要與OREPLACE()結合使用CHR()進行清理。

最後,您可以嘗試在UNIX中準備文件(如果這是您的源環境),使用類似AWK和gensub()的方法去除不良數據。

+0

事實證明,漢字字符不是問題。他們加載到一個Unicode列就好了。這是其他人物的存在讓我覺得漢字人物應該受到指責。此外,我的問題還提到了其他不支持的字符。我編輯了我的問題,以便它的前提不再解釋漢字字符。 – oscilatingcretin

+2

感謝您在這裏的努力。該正則表達式肯定會除去不可打印的字符,例如escapes('regexp_replace('1←2','[^ [:print:]]','',1,0,'i''),但它不會刪除Unicode替換字符'15712189',但我找到了一個解決方案,Oracle數據庫是'AL32UTF8'。在我的Oracle SQL中,我將所有內容都轉換爲'UTF8',將所有無效字符轉換爲'15712189',然後刪除所有這些字符從字符串和MLOAD是能夠完美地處理它。 – oscilatingcretin

0

你試過:

mload -c UTF8 <yourscript.ml 

相關問題