如何将不支持的字符加载到Teradata Unicode列中?

时间:2014-03-05 18:28:40

标签: unicode utf-8 teradata

我正在使用MLOAD将数据从Oracle提取到Teradata。事实证明这是一场噩梦,因为Oracle表包含Teradata Unicode列不接受的各种字符。在MLOAD运行后查询生成的ET_表以查看哪些列失败时,不支持的字符最终会变为�。当我使用ASCII()函数在Oracle端跟踪这些字符时,我得到的数字如160(显然是一个不间断的空格),15712189(替换字符)和15556979(根本没有出现在任何地方)在谷歌)。

有许多不受支持的字符,我不可能为它们全部硬编码。我需要以某种方式让我的MLOAD脚本去掉Unicode列不支持的任何字符。

2 个答案:

答案 0 :(得分:1)

不再适用,因为KANJI不是问题:

这可能是您必须使用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()之类的内容去除坏数据。

答案 1 :(得分:0)

你试过了吗?

mload -c UTF8 <yourscript.ml