如何在 Snowflake 中查找具有非 utf8 字符的行?
How to find rows with non utf8 characters in Snowflake?
在我的雪花数据库中,table 有非 utf8 字符。
我怎样才能在它上面创建一个只有 utf8 字符的视图;通过排除具有非 utf8 字符的行或通过替换它们?
谢谢
应该可以通过这样的测试来检查非 utf:
MY_STRING IS NOT NULL AND TRY_HEX_DECODE_STRING(HEX_ENCODE(MY_STRING)) IS NULL
但是我没有数据可以用来测试。
要将字符串重新编码为 utf-8,您可以使用 JavaScript 函数:
CREATE OR REPLACE FUNCTION TO_UTF8(BINARY_TEXT BINARY)
RETURNS TEXT LANGUAGE JAVASCRIPT STRICT IMMUTABLE AS '
var win1252 = [ /* C1 controls */
8364, 129, 8218, 402, 8222, 8230, 8224, 8225,
710, 8240, 352, 8249, 338, 141, 381, 143,
144, 8216, 8217, 8220, 8221, 8226, 8211, 8212,
732, 8482, 353, 8250, 339, 157, 382, 376
];
return String.fromCharCode(
...Array.from(BINARY_TEXT).map(x => (x < 128 || x > 159) ? x : (win1252[x - 128]))
); /* .map(...) can be removed if no conversion from win1252 needed */
';
SELECT NVL(TRY_HEX_DECODE_STRING(HEX_ENCODE(MY_STRING)),
TO_UTF8(HEX_ENCODE(MY_STRING)::BINARY));
虽然我尝试了 Hans 的解决方案,但它并非在所有情况下都有效。因此,我编写了一个非常简单的 Snowflake Javascript 存储过程,它将替换所有不属于键盘的字符。
CREATE OR REPLACE FUNCTION MYSCHEMA.REPLACE_NON_UTF8_CHARS(STR varchar)
RETURNS TEXT LANGUAGE JAVASCRIPT STRICT IMMUTABLE AS '
return STR.replace(/[^ -~]+/g, '''')
';
这可以在 sql 中实现,如下所示。
SELECT MYSCHEMA.REPLACE_NON_UTF8_CHARS(MY_STRING) AS MY_STRING
FROM
(
SELECT 'ABC,D�E123 5' AS MY_STRING
)
输出如下。 D
被空字符替换后可以看到垃圾字符
ABC,DE123 5
在我的雪花数据库中,table 有非 utf8 字符。 我怎样才能在它上面创建一个只有 utf8 字符的视图;通过排除具有非 utf8 字符的行或通过替换它们? 谢谢
应该可以通过这样的测试来检查非 utf:
MY_STRING IS NOT NULL AND TRY_HEX_DECODE_STRING(HEX_ENCODE(MY_STRING)) IS NULL
但是我没有数据可以用来测试。
要将字符串重新编码为 utf-8,您可以使用 JavaScript 函数:
CREATE OR REPLACE FUNCTION TO_UTF8(BINARY_TEXT BINARY)
RETURNS TEXT LANGUAGE JAVASCRIPT STRICT IMMUTABLE AS '
var win1252 = [ /* C1 controls */
8364, 129, 8218, 402, 8222, 8230, 8224, 8225,
710, 8240, 352, 8249, 338, 141, 381, 143,
144, 8216, 8217, 8220, 8221, 8226, 8211, 8212,
732, 8482, 353, 8250, 339, 157, 382, 376
];
return String.fromCharCode(
...Array.from(BINARY_TEXT).map(x => (x < 128 || x > 159) ? x : (win1252[x - 128]))
); /* .map(...) can be removed if no conversion from win1252 needed */
';
SELECT NVL(TRY_HEX_DECODE_STRING(HEX_ENCODE(MY_STRING)),
TO_UTF8(HEX_ENCODE(MY_STRING)::BINARY));
虽然我尝试了 Hans 的解决方案,但它并非在所有情况下都有效。因此,我编写了一个非常简单的 Snowflake Javascript 存储过程,它将替换所有不属于键盘的字符。
CREATE OR REPLACE FUNCTION MYSCHEMA.REPLACE_NON_UTF8_CHARS(STR varchar)
RETURNS TEXT LANGUAGE JAVASCRIPT STRICT IMMUTABLE AS '
return STR.replace(/[^ -~]+/g, '''')
';
这可以在 sql 中实现,如下所示。
SELECT MYSCHEMA.REPLACE_NON_UTF8_CHARS(MY_STRING) AS MY_STRING
FROM
(
SELECT 'ABC,D�E123 5' AS MY_STRING
)
输出如下。 D
被空字符替换后可以看到垃圾字符
ABC,DE123 5