如何从雪花中删除 Unicode 替换字符

Posted

技术标签:

【中文标题】如何从雪花中删除 Unicode 替换字符【英文标题】:How to remove Unicode replacement character from Snowflake 【发布时间】:2020-02-25 21:33:01 【问题描述】:

使用 COPY INTO 命令将数据加载到 Snowflake 时,有一个名为:REPLACE_INVALID_CHARACTERS 的参数。根据文档,如果将其设置为 TRUE,则任何无效的 UTF-8 字符都将替换为 Unicode 替换字符,如下所示 (�)

https://docs.snowflake.net/manuals/sql-reference/sql/copy-into-table.html#type-csv

我的问题是,如何从表中的数据中删除此字符?我曾尝试使用 REGEXP_REPLACE 但无法找出正确的模式来使用。

以下是数据的示例:

注意 LENGTH 函数甚至没有记录字符的存在,因为它说有 7 个字符,而显然有 8 个字符。

任何关于使用什么 Snowflake SQL 函数来删除这些字符的建议将不胜感激!

【问题讨论】:

你试过REPLACE(EXAMPLE,UNICODE(65533))吗?应该可行,但我目前无法测试该理论。 【参考方案1】:

“unicode 替换字符”是 \uFFFD,所以用 '' 替换它应该可以工作

select replace('asdf�', '\uFFFD', '');
--Returns: asdf

【讨论】:

【参考方案2】:

在反复支持 Snowflake 之后,我们最终决定创建自己的 javascript 函数来清除非 ascii 字符,包括这个 unicode 替换字符。

使这项工作具有挑战性的是,Snowflake 添加的 unicode 替换字符本身似乎不是一个有效字符,因此很难删除。

下面的函数是我们发现的唯一可靠的函数。它也超级快:

CREATE OR REPLACE FUNCTION ADMIN.DESIGN.REPLACE_NON_ASCII("input" varchar, "replacement" varchar )
RETURNS varchar
LANGUAGE JavaScript
AS
$$

//This function is used to cleanse non ascii characters out of data included corrupt non-unicode characters

var output = "";
if (input == undefined)
    return input

else 
  for (var i=0; i<input.length; i++) 
      if (input.charCodeAt(i) >= 32 && input.charCodeAt(i) <= 127) 
          output += input.charAt(i);
      
      else 
          output += replacement
      
  
  return output

$$

【讨论】:

以上是关于如何从雪花中删除 Unicode 替换字符的主要内容,如果未能解决你的问题,请参考以下文章

如何从java中的字符串中删除无效的unicode字符

如何替换我只有 unicode 表示的字符?

JavaScript 从字符串中删除零宽度空间(unicode 8203)

从 Snowflake 的列中删除或替换 ascii 空字符 <0x00>

从雪花中的字符串中删除变音符号[重复]

如何从python中的unicode字符串中删除除数字和“,”之外的所有字符?