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

如何将不支持的字符加载到Teradata Unicode列中?,unicode,utf-8,teradata,Unicode,Utf 8,Teradata,我正在使用MLOAD将数据从Oracle拉入Teradata。事实证明这是一场噩梦,因为Oracle表包含Teradata Unicode列不接受的各种字符。当我在MLOAD运行后查询生成的ET_表以查看哪些列失败时,不受支持的字符最终会变成ï½。当我在Oracle端使用ASCII()函数跟踪这些字符时,我得到的数字有160(显然是一个不间断的空格)、1571289(替换字符)和15556979(在谷歌的任何地方都没有显示) 有太多不受支持的字符,我不可能为它们全部硬编码。我需要让我的MLOAD

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


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

不再适用,因为汉字不是问题所在:

在这种情况下,您可能必须使用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,则可以使用正则表达式函数之一将超出拉丁语或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()

的方法去除坏数据。您是否尝试过:

mload -c UTF8 <yourscript.ml

mload-c UTF8原来汉字不是问题。它们可以加载到Unicode列中。正是其他角色的出现让我觉得汉字应该受到责备。此外,我的问题还提到了其他不受支持的字符。我编辑了我的问题,这样它的前提就不再是汉字了。谢谢你的努力。该正则表达式肯定会删除不可打印的字符,如转义符(
regexp\u replace('1←2',[^[:print:][],'',1,0,'i'
),但它并没有删除Unicode替换字符
1571289
。不过,我找到了一个解决方案。Oracle数据库是
AL32UTF8
。在我的Oracle SQL中,我将所有内容都转换为
UTF8
,这会将所有无效字符转换为
1571289
。然后我从字符串中删除所有这些字符,然后加载为ab我必须把它处理得很好。