sql - 从列中删除替换字符�

标签 sql teradata

根据我目前的研究,这个字符表示数据库和前端之间的编码错误。不幸的是,我对其中任何一个都没有任何控制权。我正在使用 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

最佳答案

您的诊断是正确的,所以首先,您可能需要检查 session 字符集(它是连接定义的一部分)。 如果是 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);

生成字符后,您现在可以将其与 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 有两个版本:

  • syslib 下的函数适用于LATIN
  • TD_SYSFNLIB 下的函数适用于 UNICODE

关于sql - 从列中删除替换字符�,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40138725/

相关文章:

sql - Report Builder 中的表格

sql - 让 SQL 只查看日期字段的 MAX 的最佳方法是什么

sql - 删除在另一个父子表中找到的父子表中的行

teradata - 在 teradata 14 中收集统计信息 - 不允许在同一组列上使用不同列顺序的多个统计信息

在 Teradata Ansi session 模式下提交

sql - 需要更好的选择 - 外连接 32 次到同一张 table

php - 何时/如何在 mysql_query 中使用反引号和单引号?

mysql - 按重复顺序排序,顶部优先,有限制

sql - 从ER图生成SQL的好软件?

sql - 为SQLEXCEPTION添加SQL EXIT HANDLER会导致语法错误和意外的文本