문자열 & 이진 데이터 타입

문자열 & 이진 데이터 타입 (String & binary data types)

Snowflake에서 지원하는 문자열/텍스트 데이터 타입과 이진 문자열 데이터 타입, 그리고 문자열 상수/리터럴의 지원 형식을 다루는 문서예요. VARCHAR, CHAR/NCHAR, STRING/TEXT 같은 텍스트 타입과 BINARY/VARBINARY 같은 이진 타입, 그리고 작은따옴표·달러 따옴표로 구분하는 문자열 상수를 확인할 수 있어요.

출처: Snowflake SQL Reference

본문

이 문서는 Snowflake에서 지원되는 문자열/텍스트 데이터 타입(이진 문자열 포함)과 문자열 상수/리터럴의 지원 형식을 설명해요.

텍스트 문자열용 데이터 타입 (Data types for text strings)

Snowflake는 텍스트(즉 문자) 문자열을 위한 다음 데이터 타입을 지원해요.

VARCHAR

VARCHAR 값은 Unicode UTF-8 문자를 담아요.

참고: Snowflake 외부의 일부 시스템에서는 CHAR, VARCHAR 같은 데이터 타입이 ASCII를 저장하고, NCHAR, NVARCHAR 같은 데이터 타입이 Unicode를 저장해요. Snowflake에서는 VARCHAR와 모든 다른 문자열 데이터 타입이 Unicode UTF-8 문자를 저장해요. CHAR와 NCHAR 데이터 타입 사이에는 Unicode 처리에 있어 차이가 없어요. NCHAR 같은 동의어는 주로 DDL 명령을 Snowflake로 포팅할 때의 구문 호환성을 위한 것이에요.

VARCHAR 타입의 열을 선언할 때, 저장할 최대 문자 수인 선택적 파라미터 (N)을 지정할 수 있어요. 예를 들어:

CREATE TABLE t1 (v VARCHAR(134217728));

길이를 지정하지 않으면 기본값은 16777216이에요.

참고: 16777216 기본값은 SQL DDL로 만든 열에 적용돼요. 일부 클라이언트는 VARCHAR 열을 최대 길이로 만드는 대신 생성하기도 해요. 예를 들어 Snowpark가 테이블 스키마를 추론할 때(예: 추론된 스키마로 DataFrame을 저장할 때) 문자열 열을 VARCHAR(134217728)로 만들어요. 그 경우 INFORMATION_SCHEMA.COLUMNSCHARACTER_MAXIMUM_LENGTH를 16777216이 아닌 134217728로 보고해요.

VARCHAR 값의 최대 길이는 문자 단위로 지정되지만, VARCHAR 값은 최대 134217728 바이트(128 MB)로도 제한돼요. VARCHAR 열에 저장할 수 있는 최대 Unicode 문자 수는 다음과 같아요.

단일 바이트(Single-byte): 134217728

멀티 바이트(Multi-byte): 67108864(문자당 2바이트)에서 33554432(문자당 4바이트) 사이

예를 들어 열을 VARCHAR(134217728)로 선언하면, 최대 길이 134217728을 지정했더라도 열은 최대 67,108,864개의 2바이트 Unicode 문자를 담을 수 있어요.

VARCHAR 열의 최대 길이를 선택할 때 다음을 고려하세요.

  • 저장 공간(Storage): 열은 실제 저장된 데이터 양만큼만 저장 공간을 사용해요. 예를 들어 VARCHAR(134217728) 열의 1자 문자열은 단일 문자만 소비해요.
  • 성능(Performance): 전체 길이 선언 VARCHAR(134217728)과 더 작은 길이 사이에는 성능 차이가 없어요.

어떤 관계형 데이터베이스에서든, WHERE 절이 VARCHAR 열이나 문자열 열을 참조하는 SELECT 문은 날짜나 숫자 열 조건으로 필터링하는 SELECT 문만큼 빠르지 않아요.

  • 데이터 작업 도구(Tools for working with data): 일부 BI/ETL 도구는 저장소나 메모리에서 VARCHAR 데이터의 최대 크기를 정의해요. 열의 최대 크기를 안다면 열을 추가할 때 크기를 제한할 수 있어요.
  • 정렬 규칙(Collation): VARCHAR 열에 정렬 규칙(collation)을 지정하면, 각 문자가 차지하는 바이트 수와 열의 정렬 규칙 지정에 따라 허용되는 문자 수가 달라져요.

정렬 규칙이 있는 열의 값을 비교할 때, Snowflake는 Unicode Collation Algorithm (UCA)을 따릅니다. 이 알고리즘은 허용되는 최대 문자 수에 영향을 미쳐요. 현재 최대 크기와 정렬 규칙 지정으로 정의된 VARCHAR 열에는 약 150만 ~ 800만 자가 허용돼요.

예를 들어 다음 표는 문자당 바이트 수와 사용된 정렬 규칙 지정에 따라 VARCHAR(134217728) 열의 최대 문자 수가 어떻게 달라질 수 있는지 보여줘요.

문자당 바이트 수 정렬 규칙 지정 허용되는 최대 문자 수 (대략)
1 byte en-ci 또는 en-ci-pi-ai 약 5600만 자
1 byte en 약 3200만 자
2 bytes en-ci-pi-ai 약 6400만 자
2 bytes en-ci 또는 en-ci-pi 약 2160만 자
2 bytes en 약 1200만 자

CHAR, CHARACTER, NCHAR

VARCHAR와 동의어예요. 단, 길이를 지정하지 않으면 CHAR(1)이 기본값이에요.

참고: Snowflake는 현재 일반적인 CHAR 의미와 달라서, 최대 길이보다 짧은 문자열은 끝에 공백으로 패딩되지 않아요.

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

VARCHAR와 동의어예요.

테이블 열의 문자열 예제 (String examples in table columns)

CREATE OR REPLACE TABLE test_text(
  vm VARCHAR(134217728),
  vd VARCHAR,
  v50 VARCHAR(50),
  cm CHAR(134217728),
  cd CHAR,
  c10 CHAR(10),
  sm STRING(134217728),
  sd STRING,
  s20 STRING(20),
  tm TEXT(134217728),
  td TEXT,
  t30 TEXT(30));

DESC TABLE test_text;
+------+--------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type               | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+--------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| VM   | VARCHAR(134217728) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| VD   | VARCHAR(16777216)  | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| V50  | VARCHAR(50)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| CM   | VARCHAR(134217728) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| CD   | VARCHAR(1)         | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| C10  | VARCHAR(10)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| SM   | VARCHAR(134217728) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| SD   | VARCHAR(16777216)  | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| S20  | VARCHAR(20)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| TM   | VARCHAR(134217728) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| TD   | VARCHAR(16777216)  | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| T30  | VARCHAR(30)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+--------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

이진 문자열용 데이터 타입 (Data types for binary strings)

Snowflake는 이진 문자열을 위한 다음 데이터 타입을 지원해요.

BINARY

최대 길이는 64 MB (67,108,864 바이트)예요. VARCHAR와 달리 BINARY 데이터 타입은 Unicode 문자 개념이 없으므로 길이는 항상 바이트 단위로 측정돼요.

BINARY 값은 TO_CHAR(<binary_expression>, 'HEX') 같은 것으로 16진수 문자열로 변환했을 때 128 MB 안에 들어맞도록 64 MB로 제한돼요.

BINARY 타입의 열을 선언할 때, 저장할 최대 바이트 수인 선택적 파라미터 (N)을 지정할 수 있어요. 예를 들어:

CREATE TABLE b1 (b BINARY(33554432));

길이를 지정하지 않으면 기본값은 8388608이에요.

VARBINARY

VARBINARY는 BINARY와 동의어예요.

내부 표현 (Internal representation)

BINARY 데이터 타입은 8비트 바이트의 시퀀스를 담아요.

Snowflake가 BINARY 데이터 값을 표시할 때, 종종 각 바이트를 두 개의 16진수 문자로 나타내요. 예를 들어 단어 HELP48454C50으로 표시될 수 있는데, 48은 문자 H의 16진수 ASCII(Unicode) 값이고, 45는 문자 E의 16진수 표현이에요.

BINARY 데이터 입력과 표시에 대한 자세한 내용은 이진 입력과 출력(Binary input and output)을 참조하세요.

테이블 열의 이진 예제 (Binary examples in table columns)

CREATE OR REPLACE TABLE test_binary(
  bd BINARY,
  b100 BINARY(100),
  vbd VARBINARY);

DESC TABLE test_binary;
+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type            | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| BD   | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| B100 | BINARY(100)     | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| VBD  | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

문자열 상수 (String constants)

상수(Constants) (또는 리터럴(literals))는 고정된 데이터 값을 말해요. Snowflake의 문자열 상수는 항상 구분 문자(delimiter) 사이에 있어야 해요. Snowflake는 문자열 상수를 구분하기 위해 다음 중 하나를 지원해요.

  • 작은따옴표(single quotes)
  • 달러 기호 쌍(pairs of dollar signs)

작은따옴표 문자열 상수 (Single-quoted string constants)

문자열 상수는 작은따옴표 구분자 사이에 넣을 수 있어요 (예: 'This is a string'). 문자열 상수 안에 작은따옴표 문자를 포함하려면 두 개의 인접한 작은따옴표를 입력해요 (예: '').

예를 들어:

SELECT 'Today''s sales projections', '-''''-';
+------------------------------+----------+
| 'TODAY''S SALES PROJECTIONS' | '-''''-' |
|------------------------------+----------|
| Today's sales projections    | -''-     |
+------------------------------+----------+

참고: 두 개의 작은따옴표는 큰따옴표 문자(")와 다르며, 큰따옴표는 (필요에 따라) 객체 식별자를 구분하는 데 사용돼요. 자세한 내용은 식별자 요구 사항(Identifier requirements)을 참조하세요.

작은따옴표 문자열 상수의 이스케이프 시퀀스 (Escape sequences in single-quoted string constants)

작은따옴표 문자열 상수에 작은따옴표나 다른 특수 문자(예: 줄바꿈)를 포함하려면 _백슬래시 이스케이프 시퀀스(backslash escape sequences)_를 사용해 이 문자들을 이스케이프해야 해요. 백슬래시 이스케이프 시퀀스는 백슬래시(\)로 시작하는 문자 시퀀스예요.

참고: 문자열에 작은따옴표, 백슬래시, 다른 특수 문자가 많으면, 달러 따옴표 문자열 상수를 사용해 이 문자들을 이스케이프하지 않을 수도 있어요.

이스케이프 시퀀스로 코드 포인트(code points)(그 문자에 해당하는 숫자 값)를 8진수나 16진수로 지정해 ASCII 문자를 삽입할 수도 있어요. 예를 들어 ASCII에서 공백 문자의 코드 포인트는 32이고, 16진수로는 20이에요. 공백을 지정하려면 16진수 이스케이프 시퀀스 \x20을 사용할 수 있어요.

\u26c4 같은 이스케이프 시퀀스로 Unicode 문자를 삽입할 수도 있어요.

다음 표는 지원되는 이스케이프 시퀀스를 네 가지 카테고리(단순, 8진수, 16진수, Unicode)로 나열해요.

이스케이프 시퀀스 나타내는 문자
단순 이스케이프 시퀀스 (Simple escape sequences)
\' 작은따옴표(') 문자.
\" 큰따옴표(") 문자.
\\ 백슬래시(\) 문자.
\b 백스페이스(backspace) 문자.
\f 용지 공급(formfeed) 문자.
\n 줄바꿈(linefeed) 문자.
\r 캐리지 리턴(carriage return) 문자.
\t 탭(tab) 문자.
\0 ASCII NUL 문자.
8진수 이스케이프 시퀀스 (Octal escape sequences)
\ooo 8진수 표기의 ASCII 문자 (각 o는 8진수 자릿수).
16진수 이스케이프 시퀀스 (Hexadecimal escape sequences)
\xhh 16진수 표기의 ASCII 문자 (각 h는 16진수 자릿수).
Unicode 이스케이프 시퀀스 (Unicode escape sequences)
\uhhhh 16진수 표기의 Unicode 문자 (각 h는 16진수 자릿수). 16진수 자릿수는 정확히 네 개여야 해요.

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

백슬래시가 위에 나열된 것 외의 시퀀스에 사용되면 그 백슬래시는 무시돼요. 예를 들어 문자 시퀀스 '\z''z'로 해석돼요.

다음 예제는 백슬래시 이스케이프 시퀀스 사용법을 보여줘요. 다음 지정 예를 포함해요.

  • 탭 문자.
  • 줄바꿈.
  • 백슬래시.
  • 느낌표(코드 포인트 33, 8진수 \041, 16진수 \x21)의 8진수와 16진수 이스케이프 시퀀스.
  • 작은 눈사람 이미지의 Unicode 이스케이프 시퀀스.
  • 유효한 이스케이프 시퀀스가 아닌 것.
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             |
+------------------------+---------------+

달러 따옴표 문자열 상수 (Dollar-quoted string constants)

어떤 경우에는 다음을 포함하는 문자열 상수를 지정해야 할 수도 있어요.

이런 경우에는 작은따옴표(') 대신 달러 기호 쌍($$)을 사용해 문자열의 시작과 끝을 구분하면 이 문자들을 이스케이프하지 않을 수 있어요.

달러 따옴표 문자열 상수에는 따옴표, 백슬래시, 줄바꿈과 다른 어떤 특수 문자도(이중 달러 기호 제외) 이스케이프하지 않고 포함할 수 있어요. 달러 따옴표 문자열 상수의 내용은 항상 문자 그대로 해석돼요.

다음 예제는 문자열 상수를 지정하는 동등한 방법들이에요.

작은따옴표 구분자 사용 예 이중 달러 기호 구분자 사용 예
sql\n'string with a \' character'\n sql\n$$string with a ' character$$\n
sql\n'regular expression with \\ characters: \\d{2}-\\d{3}-\\d{4}'\n sql\n$$regular expression with \ characters: \d{2}-\d{3}-\d{4}$$\n
sql\n'string with a newline\ncharacter'\n sql\n$$string with a newline\ncharacter$$\n

다음 예제는 줄바꿈과 여러 이스케이프 시퀀스를 포함하는 달러 따옴표 문자열 상수를 사용해요.

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

이 예제에서 이스케이프 시퀀스는 이스케이프 시퀀스가 아니라 개별 문자(예: 백슬래시 다음의 t)로 해석돼요.

더 알아보기 (Learn more)