如何从 Snowflake 中删除 Unicode 替换字符

How to remove Unicode replacement character from Snowflake

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

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

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

下面是数据的示例:

请注意 LENGTH 函数甚至没有记录该字符的存在,因为它说有 7 个字符,而实际上有 8 个字符。

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

"unicode replacement character" 是 \uFFFD,所以用 '' 替换它应该有效

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

经过与 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
}
$$