我正在使用MLOAD将数据从Oracle提取到Teradata。事实证明这是一场噩梦,因为Oracle表包含Teradata Unicode列不接受的各种字符。在MLOAD运行后查询生成的ET_
表以查看哪些列失败时,不支持的字符最终会变为�
。当我使用ASCII()
函数在Oracle端跟踪这些字符时,我得到的数字如160(显然是一个不间断的空格),15712189(替换字符)和15556979(根本没有出现在任何地方)在谷歌)。
有许多不受支持的字符,我不可能为它们全部硬编码。我需要以某种方式让我的MLOAD脚本去掉Unicode列不支持的任何字符。
答案 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