문자열 및 이진 데이터 타입

이 항목에서는 문자열 상수/리터럴에 대해 지원되는 형식과 함께, 이진 문자열을 비롯하여 Snowflake에서 지원되는 문자열/텍스트 데이터 타입에 대해 설명합니다.

이 항목의 내용:

텍스트 문자열의 데이터 타입

Snowflake는 텍스트(즉, 문자) 문자열에 대해 다음 데이터 타입을 지원합니다.

VARCHAR

VARCHAR 는 유니코드 UTF-8 문자를 보유합니다.

참고

Snowflake 외부의 일부 시스템에서 CHAR 및 VARCHAR과 같은 데이터 타입은 ASCII를 저장하는 반면, NCHAR 및 NVARCHAR과 같은 데이터 타입은 유니코드를 저장합니다.

Snowflake에서는 VARCHAR과 다른 모든 문자열 데이터 타입은 유니코드 UTF-8 문자를 저장합니다. CHAR 데이터 타입과 NCHAR 데이터 타입 간의 유니코드 처리와 관련해서는 차이가 없습니다. NCHAR과 같은 동의어는 DDL 명령을 Snowflake로 이식할 때 주로 구문 호환성을 위한 것입니다.

VARCHAR 형식의 열을 선언할 때 저장할 문자의 최대 개수인 선택적 매개 변수 (N) 을 지정할 수 있습니다. 예:

create table t1 (v varchar(16777216));
Copy

길이를 지정하지 않을 경우 기본값은 최대 허용 길이(16,777,216)입니다.

VARCHAR의 최대 길이는 문자 로 지정되지만, VARCHAR는 최대 바이트 수(16,777,216(16MB))로도 제한됩니다. VARCHAR 열에 저장할 수 있는 최대 유니코드 문자 수는 아래에 나와 있습니다.

싱글바이트

16,777,216.

멀티바이트

8,388,608(문자당 2바이트)에서 4,194,304(문자당 4바이트) 사이.

예를 들어, 열을 VARCHAR(16777216)으로 선언하면 최대 길이를 16777216으로 지정해도 그 열은 최대 8,388,608개의 2바이트 유니코드 문자를 유지할 수 있습니다.

VARCHAR 열의 최대 길이를 선택할 때 다음 사항을 고려하십시오.

  • 저장소: 열은 저장된 실제 데이터의 양만큼만 저장소를 사용합니다. 예를 들어, VARCHAR(16777216) 열의 1자짜리 문자열은 단일 문자만 사용합니다.

  • 성능: 전체 길이 VARCHAR 선언 VARCHAR(16777216)을 사용하든 더 작은 길이를 사용하든, 성능상의 차이는 없습니다.

    관계형 데이터베이스에서는 WHERE 절이 VARCHAR 열이나 문자열 열을 참조하는 SELECT 문이 날짜 또는 숫자 열 조건을 사용하여 필터링된 SELECT 문만큼 빠르지 않습니다.

  • 데이터로 작업하기 위한 도구: 일부 BI/ETL 도구는 저장소 또는 메모리에 있는 VARCHAR 데이터의 최대 크기를 정의합니다. 열의 최대 크기를 알면 열을 추가할 때 크기를 제한할 수 있습니다.

  • 데이터 정렬: VARCHAR 열에 대해 데이터 정렬 을 지정할 때 허용되는 문자 수는 각 문자가 차지하는 바이트 수와 열의 데이터 정렬 사양에 따라 다릅니다.

    정렬된 열에서 값을 비교할 때 Snowflake는 유니코드 데이터 정렬 알고리즘(UCA) 을 따릅니다. 이 알고리즘은 허용되는 최대 문자 수에 영향을 미칩니다. 현재, 최대 크기와 데이터 정렬 사양으로 정의된 VARCHAR 열에는 약 150만~800만 개의 문자가 허용됩니다.

    한 예로, 다음 표에 문자당 바이트 수와 사용된 데이터 정렬 사양에 따라 VARCHAR(16777216) 열에 대해 최대 문자 수가 어떻게 달라질 수 있는지 보여줍니다.

    문자당 바이트 수

    데이터 정렬 사양

    허용되는 최대 문자 수(대략적인 수)

    1바이트

    en-ci 또는 en-ci-pi-ai

    약 7백만 자

    1바이트

    en

    약 4백만 자

    2바이트

    en-ci-pi-ai

    약 8백만 자

    2바이트

    en-ci 또는 en-ci-pi

    약 270만 자

    2바이트

    en

    약 150만 자

CHAR , CHARACTER , NCHAR

길이가 지정되지 않은 경우 CHAR(1)이 기본값이라는 점을 제외하면 VARCHAR과 동의어입니다.

참고

Snowflake는 현재 최대 길이보다 짧은 문자열이 끝에 공백으로 채워지지 않는다는 점에서 일반적인 CHAR 의미 체계에서 벗어납니다.

STRING , TEXT , NVARCHAR , NVARCHAR2 , CHAR VARYING , NCHAR VARYING

VARCHAR과 동의어입니다.

테이블 열의 문자열 예

CREATE OR REPLACE TABLE test_text(v VARCHAR,
                                  v50 VARCHAR(50),
                                  c CHAR,
                                  c10 CHAR(10),
                                  s STRING,
                                  s20 STRING(20),
                                  t TEXT,
                                  t30 TEXT(30)
                                  );

DESC TABLE test_text;

+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| V    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| V50  | VARCHAR(50)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| C    | VARCHAR(1)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| C10  | VARCHAR(10)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| S    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| S20  | VARCHAR(20)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| T    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| T30  | VARCHAR(30)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

이진 문자열의 데이터 타입

Snowflake는 이진 문자열에 대해 다음 데이터 타입을 지원합니다.

BINARY

최대 길이는 8MB(8,388,608바이트)입니다. VARCHAR과 달리, BINARY 데이터 타입에는 유니코드 문자에 대한 개념이 없으므로 길이는 항상 바이트 단위로 측정됩니다.

(BINARY 값은 예를 들어 TO_CHAR(<이진_식>, 'HEX') 을 통해 16진수 문자열로 변환될 때 16MB 내에 맞도록 8MB로 제한됩니다.)

길이를 지정하지 않을 경우 기본값은 최대 길이입니다.

VARBINARY

VARBINARY는 BINARY와 동의어입니다.

내부 표시

BINARY 데이터 타입은 8비트 바이트의 시퀀스를 유지합니다.

Snowflake는 BINARY 데이터 값을 표시할 때 종종 각 바이트를 2개의 16진수 문자로 나타냅니다. 예를 들어 《HELP》라는 단어는 48454C50 으로 표시될 수 있습니다. 여기서 《48》은 ASCII(유니코드) 문자 《H》에 해당하는 16진수이고, 《45》는 문자 《E》의 16진수 표시입니다.

BINARY 데이터 입력 및 표시에 대한 자세한 내용은 Binary Input and Output 을 참조하십시오.

테이블 열의 이진 예

CREATE OR REPLACE TABLE test_binary(b BINARY,
                                    b100 BINARY(100),
                                    vb VARBINARY
                                    );

DESC TABLE test_binary;

+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type            | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| B    | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| B100 | BINARY(100)     | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| VB   | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

문자열 상수

상수 (리터럴 이라고도 함)는 고정 데이터 값을 가리킵니다. Snowflake에서 문자열 상수는 항상 구분 기호 문자로 묶어야 합니다. Snowflake는 다음 중 하나를 사용하여 문자열 상수를 구분하는 것을 지원합니다.

작은따옴표로 묶인 문자열 상수

문자열 상수를 작은따옴표 구분 기호로 묶을 수 있습니다(예: 'This is a string'). 문자열 상수 내에 작은따옴표 문자를 포함하려면 인접한 두 작은따옴표를 입력하십시오(예: '').

예:

SELECT 'Today''s sales projections', '-''''-';

+------------------------------+----------+
| 'TODAY''S SALES PROJECTIONS' | '-''''-' |
|------------------------------+----------|
| Today's sales projections    | -''-     |
+------------------------------+----------+
Copy

참고

작은따옴표 두 개는 큰따옴표 문자(")와 같은 것이 아니며, (필요한 경우) 오브젝트 식별자를 구분하는 데 사용됩니다. 자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

작은따옴표로 묶인 문자열 상수의 이스케이프 시퀀스

작은따옴표로 묶인 문자열 상수에 작은따옴표나 기타 특수 문자(예: 줄 바꿈)를 포함하려면 백슬래시 이스케이프 시퀀스 를 사용하여 이러한 문자를 이스케이프해야 합니다. 백슬래시 이스케이프 시퀀스는 백슬래시(\)로 시작하는 문자 시퀀스입니다.

참고

문자열에 작은따옴표, 백슬래시 또는 기타 특수 문자가 다수 포함된 경우 달러 인용 부호로 묶인 문자열 상수 를 대신 사용하여 이러한 문자를 이스케이프하지 않도록 할 수 있습니다.

또한 이스케이프 시퀀스를 사용하여 코드 포인트 (ASCII 문자에 해당하는 숫자 값)를 8진수 또는 16진수로 지정하여 이러한 문자를 삽입할 수도 있습니다. 예를 들어 ASCII에서 공백 문자의 코드 포인트는 32이며 16진수로는 20입니다. 공백을 지정하려면 16진수 이스케이프 시퀀스 \x20 을 사용할 수 있습니다.

이스케이프 시퀀스를 사용하여 유니코드 문자(예: \u26c4)를 삽입할 수도 있습니다.

다음 표에는 단순, 8진수, 16진수, 유니코드의 네 가지 카테고리로 지원되는 이스케이프 시퀀스가 나열되어 있습니다.

이스케이프 시퀀스

표시되는 문자

간단한 이스케이프 시퀀스

\'

작은따옴표(') 문자

\"

큰따옴표(") 문자

\\

백슬래시(\) 문자

\b

백스페이스 문자

\f

용지 공급 문자

\n

줄 바꿈 문자

\r

캐리지 리턴 문자

\t

탭 문자

\0

ASCII NUL 문자

8진법 이스케이프 시퀀스

\ooo

8진법의 ASCII 문자(즉, 각 o 은 8진수를 나타냄).

16진법 이스케이프 시퀀스

\xhh

16진수법의 ASCII 문자(즉, 각 h 은 16진수를 나타냄).

유니코드 이스케이프 시퀀스

\uhhhh

16진수법의 유니코드 문자(즉, 각 h 는 16진수를 나타냄). 16진수의 개수는 정확히 4개여야 합니다.

위의 표에서 보는 바와 같이, 문자열 상수에 백슬래시 문자를 포함해야 하는 경우(예: Windows 경로의 C:\ 또는 정규식\d) 백슬래시를 두 번째 백슬래시로 이스케이프해야 합니다. 예를 들어 문자열 상수의 정규식에 \d 를 포함하려면 \\d 를 사용해야 합니다.

위에 나열된 것과 다른 시퀀스에서 백슬래시를 사용할 경우에는 백슬래시가 무시됩니다. 예를 들어 문자 '\z' 의 시퀀스는 'z' 로 해석됩니다.

다음 예에서는 백슬래시 이스케이프 시퀀스의 사용 방법을 보여줍니다. 여기에는 다음을 지정하는 예가 포함됩니다.

  • 탭 문자

  • 줄 바꿈

  • 백슬래시

  • 느낌표에 대한 8진수 및 16진수 이스케이프 시퀀스(8진수로는 \041, 16진수로는 \x21 인 코드 포인트 33)

  • 눈사람을 나타내는 작은 이미지에 대한 유니코드 이스케이프 시퀀스

  • 유효한 이스케이프 시퀀스가 아닌 것

    SELECT $1, $2 FROM
    VALUES
    ('Tab','Hello\tWorld'),
    ('Newline','Hello\nWorld'),
    ('Backslash','C:\\user'),
    ('Octal','-\041-'),
    ('Hexadecimal','-\x21-'),
    ('Unicode','-\u26c4-'),
    ('Not an escape sequence', '\z')
    ;
    
    +------------------------+---------------+
    | $1                     | $2            |
    |------------------------+---------------|
    | Tab                    | Hello   World |
    | Newline                | Hello         |
    |                        | World         |
    | Backslash              | C:\user       |
    | Octal                  | -!-           |
    | Hexadecimal            | -!-           |
    | Unicode                | -⛄-          |
    | Not an escape sequence | z             |
    +------------------------+---------------+
    
    Copy

달러 기호로 묶인 문자열 상수

경우에 따라 다음을 포함하는 문자열 상수를 지정해야 할 수도 있습니다.

  • 작은따옴표 문자.

  • 백슬래시 문자(예: 정규식 의 백슬래시).

  • 줄 바꿈 문자(예: CREATE PROCEDURE 또는 CREATE FUNCTION 에서 지정하는 저장 프로시저 또는 함수의 본문에 있는 줄 바꿈).

이러한 경우에는 문자열의 시작과 끝을 구분하기 위해 작은따옴표(')가 아니라 한 쌍의 달러 기호($$)를 사용하여 이러한 문자를 이스케이프 하는 것을 피할 수 있습니다.

달러 기호로 묶인 문자열 상수에서 따옴표, 백슬래시, 줄 바꿈, 기타 특수 문자(이중 달러 기호 제외)를 이스케이프하지 않고 포함할 수 있습니다. 달러 기호로 묶인 문자열 상수의 내용은 항상 문자 그대로 해석됩니다.

다음 예는 문자열 상수를 지정하는 똑같은 방법입니다.

작은따옴표 구분 기호를 사용하는 예

이중 달러 기호 구분 기호를 사용하는 예

'string with a \' character'
Copy
$$string with a ' character$$
Copy
'regular expression with \\ characters: \\d{2}-\\d{3}-\\d{4}'
Copy
$$regular expression with \ characters: \d{2}-\d{3}-\d{4}$$
Copy
'string with a newline\\ncharacter'
Copy
$$string with a newline
character$$
Copy

다음 예에서는 줄 바꿈과 여러 이스케이프 시퀀스 를 포함하는 달러 기호로 묶인 문자열 상수를 사용합니다.

SELECT $1, $2 FROM VALUES ('row1', $$a
                                      ' \ \t
                                      \x21 z $ $$);

+------+-------------------------------------------------------+
| $1   | $2                                                    |
|------+-------------------------------------------------------|
| row1 | a                                                     |
|      |                                           ' \ \t      |
|      |                                           \x21 z $    |
+------+-------------------------------------------------------+
Copy

이 예에서는 이스케이프 시퀀스가 이스케이프 시퀀스가 아니라 개별 문자(예: 백슬래시 다음에 《t》가 붙은 문자)로 해석되는 방식에 유의하십시오.