이진 데이터 사용하기¶
BINARY 데이터 타입의 유용성과 유연성은 예시를 통해 확인할 수 있습니다. 이 항목에서는 BINARY 데이터 타입 및 3가지 인코딩 방식이 포함된 실제 작업 예시를 제공합니다.
16진수와 Base64 간에 변환하기¶
BINARY 데이터 타입은 16진수와 base64 문자열 간에 변환할 때 임시 단계로 사용할 수 있습니다.
16진수에서 base64로 변환하려면 TO_CHAR 을 사용합니다.
SELECT c1, TO_CHAR(TO_BINARY(c1, 'hex'), 'base64') FROM hex_strings;
+----------------------+-----------------------------------------+ | C1 | TO_CHAR(TO_BINARY(C1, 'HEX'), 'BASE64') | |----------------------+-----------------------------------------| | df32ede209ed5a4e3c25 | 3zLt4gntWk48JQ== | | AB4F3C421B | q088Qhs= | | 9324df2ecc54 | kyTfLsxU | +----------------------+-----------------------------------------+
base64에서 16진수로 변환합니다.
SELECT c1, TO_CHAR(TO_BINARY(c1, 'base64'), 'hex') FROM base64_strings;
+------------------+-----------------------------------------+ | C1 | TO_CHAR(TO_BINARY(C1, 'BASE64'), 'HEX') | |------------------+-----------------------------------------| | 3zLt4gntWk48JQ== | DF32EDE209ED5A4E3C25 | | q088Qhs= | AB4F3C421B | | kyTfLsxU | 9324DF2ECC54 | +------------------+-----------------------------------------+
텍스트와 UTF-8 바이트 간에 변환하기¶
Snowflake의 문자열은 유니코드 문자로 구성되고 바이너리 값은 바이트로 구성됩니다. 문자열을 UTF-8 형식의 이진 값으로 변환하면 유니코드 문자로 구성된 바이트를 직접 조작할 수 있습니다.
단일 문자 문자열을 UTF-8 표현(바이트)으로 변환하려면 TO_BINARY 를 사용합니다.
SELECT c1, TO_BINARY(c1, 'utf-8') FROM characters;
+----+------------------------+ | C1 | TO_BINARY(C1, 'UTF-8') | |----+------------------------| | a | 61 | | é | C3A9 | | ❄ | E29D84 | | π | CF80 | +----+------------------------+
UTF-8 바이트 시퀀스를 문자열로 변환하려면 TO_CHAR , TO_VARCHAR 을 사용합니다.
SELECT TO_CHAR(X'41424320E29D84', 'utf-8');
+-------------------------------------+ | TO_CHAR(X'41424320E29D84', 'UTF-8') | |-------------------------------------| | ABC ❄ | +-------------------------------------+
Base64 형식의 MD5 다이제스트 가져오기¶
이진 MD5 다이제스트를 base64 문자열로 변환하려면 TO_CHAR 을 사용합니다.
SELECT TO_CHAR(MD5_BINARY(c1), 'base64') FROM variants;
+----------+-----------------------------------+ | C1 | TO_CHAR(MD5_BINARY(C1), 'BASE64') | |----------+-----------------------------------| | 3 | 7MvIfktc4v4oMI/Z8qe68w== | | 45 | bINJzHJgrmLjsTloMag5jw== | | "abcdef" | 6AtQFwmJUPxYqtg8jBSXjg== | | "côté" | H6G3w1nEJsUY4Do1BFp2tw== | +----------+-----------------------------------+
바이너리를 변수 형식으로 변환하기¶
문자열에서 추출된 바이너리 형식을 사용하여 문자열을 바이너리 값으로 변환합니다. 문에는 TRY_TO_BINARY 및 SPLIT_PART 함수가 포함됩니다.
SELECT c1, TRY_TO_BINARY(SPLIT_PART(c1, ':', 2), SPLIT_PART(c1, ':', 1)) AS binary_value FROM strings;
+-------------------------+----------------------+ | C1 | BINARY_VALUE | |-------------------------+----------------------| | hex:AB4F3C421B | AB4F3C421B | | base64:c25vd2ZsYWtlCg== | 736E6F77666C616B650A | | utf8:côté | 63C3B474C3A9 | | ???:abc | NULL | +-------------------------+----------------------+
변환을 위해 다음과 같이 여러 형식을 사용할 수 있습니다.
SELECT c1, COALESCE( x'00' || TRY_TO_BINARY(c1, 'hex'), x'01' || TRY_TO_BINARY(c1, 'base64'), x'02' || TRY_TO_BINARY(c1, 'utf-8')) AS binary_value FROM strings;
+------------------+------------------------+ | C1 | BINARY_VALUE | |------------------+------------------------| | ab4f3c421b | 00AB4F3C421B | | c25vd2ZsYWtlCg== | 01736E6F77666C616B650A | | côté | 0263C3B474C3A9 | | 1100 | 001100 | +------------------+------------------------+
참고
위의 쿼리에서 TRY_TO_BINARY 가 사용되었으므로, 형식을 인식할 수 없거나 지정된 형식으로 문자열의 구문을 분석할 수 없는 경우 결과는 NULL 입니다.
결과를 이전 예시에서 문자열로 다시 변환하려면 SUBSTR 및 DECODE 를 사용합니다.
SELECT c1, TO_CHAR( SUBSTR(c1, 2), DECODE(SUBSTR(c1, 1, 1), x'00', 'hex', x'01', 'base64', x'02', 'utf-8')) AS string_value FROM bin;
+------------------------+------------------+ | C1 | STRING_VALUE | |------------------------+------------------| | 00AB4F3C421B | AB4F3C421B | | 01736E6F77666C616B650A | c25vd2ZsYWtlCg== | | 0263C3B474C3A9 | côté | | 001100 | 1100 | +------------------------+------------------+
JavaScript UDF를 사용한 사용자 지정 디코딩¶
BINARY 데이터 타입을 사용하면 임의 데이터를 저장할 수 있습니다. JavaScript UDFs는 Uint8Array
를 통한 데이터 타입을 지원(JavaScript UDF 소개 참조)하므로 JavaScript에서는 사용자 지정 디코딩 로직을 구현할 수 있습니다. 이 방법이 가장 효율적인 방법은 아니지만, 매우 강력한 방법입니다.
첫 번째 바이트를 기준으로 디코딩하는 함수 만들기:
CREATE OR REPLACE FUNCTION my_decoder (b BINARY) RETURNS VARIANT LANGUAGE JAVASCRIPT AS ' IF (B[0] == 0) { var number = 0; FOR (var i = 1; i < B.length; i++) { number = number * 256 + B[i]; } RETURN number; } IF (B[0] == 1) { var str = ""; FOR (var i = 1; i < B.length; i++) { str += String.fromCharCode(B[i]); } RETURN str; } RETURN NULL;';
SELECT c1, my_decoder(c1) FROM bin;
+----------------+----------------+ | C1 | MY_DECODER(C1) | |----------------+----------------| | 002A | 42 | | 0148656C6C6F21 | "Hello!" | | 00FFFF | 65535 | | 020B1701 | null | +----------------+----------------+