根据我到目前为止的研究,此字符表示数据库与前端之间的编码错误。不幸的是,我对这两个都没有任何控制权。我正在使用Teradata Studio。
如何过滤掉这个字符?我正在尝试REGEX_SUBSTR在偶尔包含的列上执行函数锟�,这将引发错误“字符串包含不可翻译的字符”。
REGEX_SUBSTR
锟�
这是我的SQL。AIRCFT_POSITN_ID是包含替换字符的列。
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
您的诊断是正确的,因此,首先,您可能需要检查 会话字符集 (它是连接定义的一部分)。如果是 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);
生成角色后,您现在可以将其与 REPLACE 或 OTRANSLATE一起使用
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
顺便说一句, OTRANSLATE 和 OREPLACE 有2个版本: