【问题标题】:How can I load unsupported characters into a Teradata Unicode column?如何将不受支持的字符加载到 Teradata Unicode 列中?
【发布时间】:2017-01-05 20:49:21
【问题描述】:

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

有太多不受支持的字符,我不可能对它们都进行硬编码。我需要以某种方式让我的 MLOAD 脚本去除 Unicode 列不支持的任何字符。

【问题讨论】:

    标签: unicode utf-8 teradata


    【解决方案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() 之类的工具去除不良数据。

    【讨论】:

    • 原来汉字不是问题。它们加载到 Unicode 列中就好了。是其他字符的存在让我认为汉字字符是罪魁祸首。此外,我的问题还提到了其他不受支持的字符。我编辑了我的问题,使其前提不再考虑汉字字符。
    • 感谢您的努力。该正则表达式当然会删除无法打印的字符,例如转义符 (regexp_replace('1←2','[^[:print:]]','',1,0,'i'),但不会删除 Unicode 替换字符 15712189。不过,我找到了解决方案。 Oracle 数据库是AL32UTF8。在我的 Oracle SQL 中,我将所有内容都转换为 UTF8,这会将所有无效字符转换为 15712189。然后我从字符串中删除所有这些字符,MLOAD 能够完美地处理它。
    【解决方案2】:

    你试过了吗:

    mload -c UTF8 <yourscript.ml
    

    ?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      相关资源
      最近更新 更多