小编典典

从列中删除替换字符锟

sql

根据我到目前为止的研究,此字符表示数据库与前端之间的编码错误。不幸的是,我对这两个都没有任何控制权。我正在使用Teradata Studio。

如何过滤掉这个字符?我正在尝试REGEX_SUBSTR在偶尔包含的列上执行函数锟�,这将引发错误“字符串包含不可翻译的字符”。

这是我的SQL。AIRCFT_POSITN_ID是包含替换字符的列。

 SELECT DISTINCT AIRCFT_POSITN_ID, 
 REGEXP_SUBSTR(AIRCFT_POSITN_ID, '[0-9]+') AS AUTOROW
 FROM PROD_MAE_MNTNC_VW.FMR_DISCRPNCY_DFRL 
 WHERE DFRL_CREATE_TMS > CURRENT_DATE -25

阅读 224

收藏
2021-04-28

共1个答案

小编典典

您的诊断是正确的,因此,首先,您可能需要检查 会话字符集 (它是连接定义的一部分)。如果是 ASCII, 则将其更改为 UTF8
,您将能够看到原始字符而不是替代字符。


如果字符确实是数据的一部分,而不仅仅是编码翻译问题的指示:

替代字符AKA SUB (DEC:26十六进制:1A)在Teradata中非常独特。

您不能直接使用-

select  '锟�';

-- [6706] The string contains an untranslatable character.

select  '1A'XC;

-- [6706] The string contains an untranslatable character.

如果您使用的是14.0或更高版本,则可以使用 CHR 函数生成它:

select  chr(26);

如果您的版本低于14.0,则可以这样生成:

select  translate (_unicode '05D0'XC using unicode_to_latin with error);

生成角色后,您现在可以将其与 REPLACEOTRANSLATE一起使用

create multiset table t (i int,txt varchar(100) character set latin) unique primary index (i);

insert into t (i,txt) values (1,translate ('Hello 砖诇讜诐 world 注讜诇诐' using unicode_to_latin with error));

select * from t;

-- Hello 锟斤拷锟斤拷 world 锟斤拷锟斤拷

select otranslate (txt,chr(26),'') from t;

-- Hello  world

select otranslate (txt,translate (_unicode '05D0'XC using unicode_to_latin with error),'') from t;

-- Hello  world

顺便说一句, OTRANSLATEOREPLACE 有2个版本:

  • syslib 下的功能可与 LATIN一起使用
  • TD_SYSFNLIB 下的功能可与 UNICODE一起使用
2021-04-28