如何从雪花中删除 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 替换字符的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 从字符串中删除零宽度空间(unicode 8203)