从列中删除替换字符�
Removing replacement character � from column
根据我目前的研究,这个字符表示数据库和前端之间的编码错误。不幸的是,我对其中任何一个都没有任何控制权。我正在使用 Teradata Studio。
如何过滤掉这个字符?我正在尝试对偶尔包含 �
的列执行 REGEX_SUBSTR
函数,这会引发错误 "The string contains an untranslatable character".
这是我的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
您的诊断是正确的,所以首先,您可能需要检查 会话字符集(它是连接定义的一部分)。
如果它是 ASCII 将其更改为 UTF8 并且您将能够看到原始字符而不是替换字符。
如果字符确实是数据的一部分而不仅仅是编码翻译问题的指示:
替换字符 AKA SUB (DEC: 26 HEX: 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:
有两个版本
- syslib 下的函数适用于 LATIN.
- TD_SYSFNLIB下的函数适用于UNICODE.
除了上面嘟嘟的精彩回答外,我又遇到了这个问题,有更多的时间来试验,所以我想补充以下内容。以下 SELECT 命令产生了不可翻译的字符:
SELECT IDENTIFY FROM PROD_MAE_MNTNC_VW.SCHD_MNTNC;
IDENTIFY
24FEB1747659193DC330A163DCL�ORD
尝试直接对此字符执行 REGEXP_REPLACE 或 OREPLACE 会产生错误:
Failed [6706 : HY000] The string contains an untranslatable character.
我将 Teradata 连接中的 CHARSET 属性 从 UTF8 更改为 ASCII,现在我可以看到有问题的字符,看起来像一个制表符
IDENTIFY
使用使用此特定转换的 TRANSLATE_CHK 命令成功并识别出违规字符的位置(请注意,这不适用于 UTF8 字符集):
TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE) AS BADCHAR
BADCHAR
28
现在可以使用一些 CASE 语句来处理这个字符,以删除坏字符并保留字符串的其余部分:
CASE WHEN TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE) = 0 THEN IDENTIFY
ELSE SUBSTR(IDENTIFY, 1, TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE)-1)
END AS IDENTIFY
希望这对某人有所帮助。
根据我目前的研究,这个字符表示数据库和前端之间的编码错误。不幸的是,我对其中任何一个都没有任何控制权。我正在使用 Teradata Studio。
如何过滤掉这个字符?我正在尝试对偶尔包含 �
的列执行 REGEX_SUBSTR
函数,这会引发错误 "The string contains an untranslatable character".
这是我的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
您的诊断是正确的,所以首先,您可能需要检查 会话字符集(它是连接定义的一部分)。 如果它是 ASCII 将其更改为 UTF8 并且您将能够看到原始字符而不是替换字符。
如果字符确实是数据的一部分而不仅仅是编码翻译问题的指示:
替换字符 AKA SUB (DEC: 26 HEX: 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:
有两个版本- syslib 下的函数适用于 LATIN.
- TD_SYSFNLIB下的函数适用于UNICODE.
除了上面嘟嘟的精彩回答外,我又遇到了这个问题,有更多的时间来试验,所以我想补充以下内容。以下 SELECT 命令产生了不可翻译的字符:
SELECT IDENTIFY FROM PROD_MAE_MNTNC_VW.SCHD_MNTNC;
IDENTIFY
24FEB1747659193DC330A163DCL�ORD
尝试直接对此字符执行 REGEXP_REPLACE 或 OREPLACE 会产生错误:
Failed [6706 : HY000] The string contains an untranslatable character.
我将 Teradata 连接中的 CHARSET 属性 从 UTF8 更改为 ASCII,现在我可以看到有问题的字符,看起来像一个制表符
IDENTIFY
使用使用此特定转换的 TRANSLATE_CHK 命令成功并识别出违规字符的位置(请注意,这不适用于 UTF8 字符集):
TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE) AS BADCHAR
BADCHAR
28
现在可以使用一些 CASE 语句来处理这个字符,以删除坏字符并保留字符串的其余部分:
CASE WHEN TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE) = 0 THEN IDENTIFY
ELSE SUBSTR(IDENTIFY, 1, TRANSLATE_CHK(IDENTIFY USING KANJI1_SBC_TO_UNICODE)-1)
END AS IDENTIFY
希望这对某人有所帮助。