如何从 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
}
$$
使用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
}
$$