바이너리 입력 및 출력

Snowflake는 16진수, base64 및 UTF-8의 3가지 바이너리 형식 또는 인코딩 방식을 지원합니다.

이 항목의 내용:

지원되는 바이너리 형식의 개요

16진수(기본값)

《16진수》 형식이란 16진수 또는 base 16 체계를 의미합니다. 이 형식에서 각 바이트는 2개 문자(0~9 사이의 숫자 및 A ~ F 사이의 문자)로 표현됩니다. 16진수를 사용하면 다음 변환을 수행할 수 있습니다.

변환 전:

변환 후:

참고

바이너리

문자열

16진수에서는 대문자를 사용합니다.

문자열

바이너리

16진수에서는 대/소문자를 구분합니다.

16진수는 기본 바이너리 형식입니다.

base64

《base64》 형식은 바이너리 데이터(또는 문자열 데이터)를 인쇄 가능 ASCII 문자(문자, 숫자 및 구두점 또는 수학 연산자)로 인코딩합니다. (base64 인코딩 방식에 대한 정의는 RFC4648 에서 제공됩니다.)

Base64로 인코딩된 데이터의 이점은 다음과 같습니다.

  • Base64로 인코딩된 데이터는 순수 ASCII 텍스트이므로, BINARY 데이터가 아닌 ASCII 문자 데이터를 지원하는 시스템에 저장할 수 있습니다. 예를 들어, 음악(디지털 샘플)을 표현하는 바이너리 데이터 또는 중국어 문자를 표현하는 UTF 데이터는 ASCII 텍스트로 인코딩하여 ASCII 문자만 지원하는 시스템에 저장할 수 있습니다.

  • Base64로 인코딩된 데이터에는 제어 문자(예: 전송 끝 문자, 탭 문자)가 포함되지 않으므로, base64로 인코딩된 데이터는 제어 문자가 데이터가 아닌 명령으로 해석될 위험 없이 수신 및 송신할 수 있습니다. base64로 인코딩된 데이터는 한 번에 1개의 데이터를 주고 받는(패킷의 어느 부분이 데이터이고 어느 부분이 헤더 또는 제어 정보인지를 나타내는 패킷 헤더 또는 프로토콜을 사용하지 않음) 기존 모뎀 및 전자 통신 장비와 호환됩니다.

Base64로 인코딩된 데이터의 단점은 다음과 같습니다.

  • 바이너리와 인쇄 가능 데이터 ASCII 표현 사이에서 데이터를 서로 변환하기 위해서는 계산 리소스가 사용됩니다.

  • Base64로 인코딩된 데이터는 원본 데이터에 비해 약 1/3의 저장소 공간을 더 많이 차지합니다.

아래는 관심 있는 사용자를 위한 인코딩 관련 세부 정보입니다.

base64 인코딩 세부 정보

바이너리 데이터의 8비트 바이트 3개(총 24비트)로 구성된 각 그룹이 각 6비트의 4개 그룹(24비트 유지)으로 재정렬됩니다. 64개의 가능한 6비트 조합 각각은 다음의 64개 인쇄 가능 ASCII 문자 중 하나를 나타냅니다.

  • 대문자(A~Z)

  • 소문자(a~z)

  • 숫자(0 ~ 9)

  • +

  • /

또한, = 문자는 입력의 길이가 정확히 3의 배수가 아닐 때 채우기 문자로 사용됩니다.

base64로 인코딩된 데이터에는 공백 문자(예: 빈칸 및 줄 바꿈)가 포함되지 않으므로, 필요한 경우 base64로 인코딩된 데이터와 공백을 함께 사용할 수 있습니다. 예를 들어, 전송자 또는 수신자의 라인 길이에 최대 제한이 있는 경우 줄 바꿈 문자를 추가하여 데이터의 손상을 유발하지 않고 base64로 인코딩된 데이터를 개별 라인으로 분할할 수 있습니다. base64를 사용하면 다음 변환을 수행할 수 있습니다.

변환 전:

변환 후:

참고

바이너리

문자열

base64는 공백 또는 줄 바꿈을 삽입하지 않습니다.

문자열

바이너리

base64는 모든 공백 및 줄 바꿈을 무시합니다.

UTF-8

UTF-8 형식은 유니코드용 UTF-8 문자 인코딩을 의미합니다.

UTF-8은 텍스트에서 바이너리로의 인코딩에서 사용됩니다. 가능한 모든 BINARY 값을 유효한 UTF-8 문자열로 변환할 수 있는 것은 아니므로 바이너리에서 텍스트로의 인코딩에서는 UTF-8을 사용할 수 없습니다.

이 형식은 기본 데이터를 한 가지 타입 또는 다른 타입으로 재해석하기 위해 바이너리와 문자열 사이에서 일대일 변환을 수행할 때 실제 인코딩 및 디코딩보다 편리합니다.

바이너리 값에 대한 세션 매개 변수

바이너리 값을 Snowflake와 송수신하는 방법은 다음과 같은 세션 매개 변수 2개로 결정됩니다.

  • BINARY_INPUT_FORMAT:

    VARCHAR에서 BINARY로 변환하는 함수에 대한 VARCHAR 입력의 형식을 지정합니다. 용도는 다음과 같습니다.

    • 1개의 인자가 사용되는 TO_BINARY 버전에서 BINARY로 변환합니다.

    • Snowflake로 데이터를 로드합니다(파일 형식 옵션이 지정되지 않은 경우, 자세한 내용은 아래 참조).

    매개 변수는 〈HEX〉, 〈BASE64〉 또는 〈UTF-8〉(〈UTF8’도 허용)로 설정할 수 있습니다. 매개 변수 값에서는 대/소문자가 구분됩니다. 기본값은 〈HEX’입니다.

  • BINARY_OUTPUT_FORMAT:

    BINARY에서 VARCHAR로 변환하는 함수에서 제공되는 VARCHAR 출력의 형식을 지정합니다. 용도는 다음과 같습니다.

    • 1개의 인자가 사용되는 TO_CHAR , TO_VARCHAR 버전에서 VARCHAR로 변환합니다.

    • Snowflake에서 데이터를 언로드합니다(파일 형식 옵션이 지정되지 않은 경우, 자세한 내용은 아래 참조).

    • 바이너리에서 varchar로의 변환이 명시적으로 호출되지 않은 경우 사람이 읽을 수 있는 형식(예: Snowflake 웹 인터페이스에서)으로 바이너리 데이터를 표시합니다.

    매개 변수는 〈HEX〉 또는 〈BASE64’로 설정할 수 있습니다. 매개 변수 값에서는 대/소문자가 구분됩니다. 기본값은 〈HEX’입니다.

    참고

    UTF-8 형식의 경우 바이너리에서 문자열로의 변환이 실패할 수 있으므로, BINARY_OUTPUT_FORMAT을 UTF-8로 설정할 수 없습니다. 이러한 상황에서 UTF-8를 사용하여 변환하려면, 2개의 인자가 사용되는 TO_CHAR , TO_VARCHAR 버전을 사용해야 합니다.

매개 변수는 계정, 사용자 및 세션 수준에서 설정할 수 있습니다. 현재 세션의 모든 작업에 적용되는 현재 매개 변수를 확인하려면 SHOW PARAMETERS 명령을 실행합니다.

바이너리 값을 로드/언로드하기 위한 파일 형식 옵션

바이너리 입력 및 출력 세션 매개 변수와 별도로, Snowflake는 BINARY_FORMAT 파일 형식 옵션을 제공하며, 이 옵션을 사용하면 Snowflake 테이블에 데이터를 로드하거나 데이터를 언로드할 때 바이너리 형식을 명시적으로 제어할 수 있습니다.

이 옵션은 〈HEX〉, 〈BASE64〉 또는 〈UTF-8〉(값은 대/소문자 구분)로 설정할 수 있습니다. 이 옵션은 데이터 로딩 및 언로딩 모두에 영향을 미치며, 다른 파일 형식 옵션과 유사하게 다음과 같은 다양한 방법으로 지정이 가능합니다.

  • 명명된 파일 형식, 이름이 지정된 스테이지 또는 COPY 명령에서 직접 참조 가능.

  • 이름이 지정된 스테이지, COPY 명령에서 직접 참조 가능.

  • COPY 명령에서 직접.

데이터 로딩

데이터 로딩에서 사용되는 경우, BINARY_FORMAT은 스테이징된 데이터 파일에서 바이너리 값의 형식을 지정합니다. 이 옵션은 세션의 BINARY_INPUT_FORMAT 매개 변수에 설정된 모든 값을 덮어씁니다 (위의 바이너리 값에 대한 세션 매개 변수 참조).

이 옵션이 〈HEX〉 또는 〈BASE64’로 설정된 경우 스테이징된 데이터 파일의 문자열이 유효한 16진수 또는 base64가 아니면 데이터 로딩이 실패하게 됩니다. 이 경우 Snowflake는 오류를 반환하고 ON_ERROR 복사 옵션에 지정된 동작이 수행됩니다.

데이터 언로딩

데이터 언로드에서 사용되는 경우, BINARY_FORMAT 옵션은 지정된 스테이지의 파일로 언로드된 바이너리 값에 적용되는 형식을 지정합니다. 이 옵션은 세션의 BINARY_OUTPUT_FORMAT 매개 변수에 설정된 모든 값을 덮어씁니다 (위의 바이너리 값에 대한 세션 매개 변수 참조).

옵션이 UTF-8로 지정된 경우, 테이블의 바이너리 값에 유효하지 않은 UTF-8이 포함되면 데이터 언로드가 실패하게 됩니다. 이러한 경우 Snowflake는 오류를 반환합니다.

예시 입력/출력

《보는 것과 출력이 일치하지 않는 경우가 있으므로》 BINARY 입력/출력이 혼란스러울 수 있습니다.

예를 들어, 다음 코드 시퀀스를 생각해 보겠습니다.

CREATE TABLE binary_table (v VARCHAR, b BINARY);
INSERT INTO binary_table (v, b)
    SELECT 'AB', TO_BINARY('AB');
SELECT v, b FROM binary_table;
+----+----+
| V  | B  |
|----+----|
| AB | AB |
+----+----+

v열(VARCHAR)과 b열의 출력은 동일하게 보일 수 있습니다. 그러나 b열의 값은 바이너리로 변환되었습니다. b열의 값이 변경되지 않은 것처럼 보이는 이유는 무엇일까요?

정답은 TO_BINARY 의 인자는 16진수 숫자 시퀀스(따옴표로 묶여 문자열처럼 보이지만)로 처리되며, 실제로는 표시되는 2개 문자가 2바이트의 문자열 데이터가 아닌 1바이트의 바이너리 데이터를 나타내는 16진수 숫자 쌍으로 해석되어 표시되기 때문입니다. (입력 《문자열》에 16진수 이외의 문자가 포함된 경우에는 이 작업이 처리되지 않았을 것이며, 《문자열 〈…〉이(가) 올바른 16진수로 인코딩된 문자열이 아닙니다》와 유사한 오류 메시지가 결과로 제공되었을 것입니다.)

또한, BINARY 데이터는 표시될 때 기본적으로 16진수 숫자의 시퀀스로 표시됩니다. 그러므로 데이터가 16진수 숫자(문자열 아님)로 입력되고 16진수 숫자로 표시되므로 변경되지 않은 것처럼 보입니다.

사실, 2문자 문자열 〈AB’를 저장하는 것이 목적이었다면 이 코드는 잘못된 것입니다. 올바른 코드는 HEX_ENCODE 함수를 사용하여 문자열을 16진수 숫자 시퀀스로 변환(또는 다른 《인코딩》 함수를 사용하여 base64와 같은 다른 형식으로 변환)한 후 데이터를 저장하는 것입니다. 그러한 예는 아래에서 제공됩니다.

16진수(《HEX》) 형식의 예

BINARY 데이터를 저장하는 한 가지 방법은 이를 16진수 문자의 문자열로 인코딩하는 것입니다. 예시는 아래와 같습니다.

BINARY열을 사용하여 테이블을 생성합니다.

CREATE TABLE demo_binary (b BINARY);

TO_BINARY() 함수를 사용하여 《일반》 문자열을 삽입하고 유효한 BINARY 값으로 변환하면 실패하게 됩니다.

INSERT INTO demo_binary (b) SELECT TO_BINARY('HELP', 'HEX');

오류 메시지는 다음과 같습니다.

100115 (22000): The following string is not a legal hex-encoded value: 'HELP'

이번에는 입력을 16진수 숫자의 문자열로 명시적으로 변환한 후 삽입합니다(성공함).

INSERT INTO demo_binary (b) SELECT TO_BINARY(HEX_ENCODE('HELP'), 'HEX');

이제 데이터를 검색합니다.

SELECT TO_VARCHAR(b), HEX_DECODE_STRING(TO_VARCHAR(b)) FROM demo_binary;
+---------------+----------------------------------+
| TO_VARCHAR(B) | HEX_DECODE_STRING(TO_VARCHAR(B)) |
|---------------+----------------------------------|
| 48454C50      | HELP                             |
+---------------+----------------------------------+

보시다시피, 기본적으로 출력은 16진수로 표시됩니다. 원본 문자열을 다시 가져오려면, HEX_DECODE_STRING 함수(문자열을 인코딩하기 위해 이전에 사용한 HEX_ENCODE_STRING 함수의 반대)를 사용합니다.

다음 도움말은 내부적인 처리 방법을 자세하게 설명합니다.

SELECT 'HELP', HEX_ENCODE('HELP'), b, HEX_DECODE_STRING(HEX_ENCODE('HELP')),
   TO_VARCHAR(b), HEX_DECODE_STRING(TO_VARCHAR(b)) FROM demo_binary;

출력:

SELECT 'HELP', HEX_ENCODE('HELP'), b, HEX_DECODE_STRING(HEX_ENCODE('HELP')),
   TO_VARCHAR(b), HEX_DECODE_STRING(TO_VARCHAR(b)) FROM demo_binary;
+--------+--------------------+----------+---------------------------------------+---------------+----------------------------------+
| 'HELP' | HEX_ENCODE('HELP') | B        | HEX_DECODE_STRING(HEX_ENCODE('HELP')) | TO_VARCHAR(B) | HEX_DECODE_STRING(TO_VARCHAR(B)) |
|--------+--------------------+----------+---------------------------------------+---------------+----------------------------------|
| HELP   | 48454C50           | 48454C50 | HELP                                  | 48454C50      | HELP                             |
+--------+--------------------+----------+---------------------------------------+---------------+----------------------------------+

BASE64 형식의 예

이 섹션을 읽기 전, 위의 16진수 형식 섹션을 먼저 확인하십시오. 기본 개념은 유사하며, 16진수 형식 섹션에서 더 자세한 설명이 제공됩니다.

BINARY열을 사용하여 테이블을 생성합니다.

CREATE TABLE demo_binary (b BINARY);

행을 삽입합니다.

INSERT INTO demo_binary (b) SELECT TO_BINARY(BASE64_ENCODE('HELP'), 'BASE64');

해당 행을 검색합니다.

SELECT 'HELP', BASE64_ENCODE('HELP'),
   BASE64_DECODE_STRING(BASE64_ENCODE('HELP')),
   TO_VARCHAR(b, 'BASE64'), 
   BASE64_DECODE_STRING(TO_VARCHAR(b, 'BASE64'))
   FROM demo_binary;
+--------+-----------------------+---------------------------------------------+-------------------------+-----------------------------------------------+
| 'HELP' | BASE64_ENCODE('HELP') | BASE64_DECODE_STRING(BASE64_ENCODE('HELP')) | TO_VARCHAR(B, 'BASE64') | BASE64_DECODE_STRING(TO_VARCHAR(B, 'BASE64')) |
|--------+-----------------------+---------------------------------------------+-------------------------+-----------------------------------------------|
| HELP   | SEVMUA==              | HELP                                        | SEVMUA==                | HELP                                          |
+--------+-----------------------+---------------------------------------------+-------------------------+-----------------------------------------------+

UTF-8 형식의 예

BINARY열을 사용하여 테이블을 생성합니다.

CREATE TABLE demo_binary (b BINARY);

행을 삽입합니다.

INSERT INTO demo_binary (b) SELECT TO_BINARY('HELP', 'UTF-8');

해당 행을 검색합니다.

SELECT 'HELP', TO_VARCHAR(b, 'UTF-8')
   FROM demo_binary;
+--------+------------------------+
| 'HELP' | TO_VARCHAR(B, 'UTF-8') |
|--------+------------------------|
| HELP   | HELP                   |
+--------+------------------------+
맨 위로 이동