데이터 타입

데이터 타입 (Data Types)

아래 표는 모든 내장 범용 데이터 타입을 보여줘요. 별칭 컬럼에 나열된 대안들은 이 타입들을 가리키는 데도 사용할 수 있지만, 별칭은 SQL 표준의 일부가 아니므로 다른 데이터베이스 엔진에서는 받아들여지지 않을 수 있다는 점을 주의하세요. 함께 살펴볼까요?

출처: 문서

본문

범용 데이터 타입 (General-Purpose Data Types)

아래 표는 모든 내장 범용 데이터 타입을 보여줘요. 별칭 컬럼에 나열된 대안들은 이 타입들을 가리키는 데도 사용할 수 있어요. 단, 별칭은 SQL 표준의 일부가 아니므로 다른 데이터베이스 엔진에서는 받아들여지지 않을 수 있다는 점을 주의하세요.

이름 별칭 (Aliases) 설명 (Description)
BIGINT INT8, LONG 부호 있는 8바이트 정수
BIT BITSTRING 1과 0의 문자열
BLOB BYTEA, BINARY, VARBINARY 가변 길이 이진 데이터
BIGNUM 가변 길이 정수
BOOLEAN BOOL, LOGICAL 논리 Boolean (true / false)
DATE 달력 날짜 (year, month, day)
DECIMAL(prec, scale) NUMERIC(prec, scale) 주어진 width(정밀도)와 scale을 가진 고정 정밀도 숫자, 기본값 prec = 18scale = 3
DOUBLE FLOAT8 배정밀도 부동소수점 숫자 (8바이트)
FLOAT FLOAT4, REAL 단정밀도 부동소수점 숫자 (4바이트)
HUGEINT 부호 있는 16바이트 정수
INTEGER INT4, INT, SIGNED 부호 있는 4바이트 정수
INTERVAL 날짜 / 시간 델타
JSON JSON 객체 ([json 확장]({% link docs/current/data/json/overview.md %})을 통해)
SMALLINT INT2, SHORT 부호 있는 2바이트 정수
TIME 하루 중 시간 (시간대 없음)
TIMESTAMP WITH TIME ZONE TIMESTAMPTZ 현재 시간대를 사용하는 시간과 날짜의 조합
TIMESTAMP DATETIME 시간과 날짜의 조합
TINYINT INT1 부호 있는 1바이트 정수
UBIGINT 부호 없는 8바이트 정수
UHUGEINT 부호 없는 16바이트 정수
UINTEGER 부호 없는 4바이트 정수
USMALLINT 부호 없는 2바이트 정수
UTINYINT 부호 없는 1바이트 정수
UUID [UUID 데이터 타입]({% link docs/current/sql/data_types/numeric.md %}#universally-unique-identifiers-uuids)
VARCHAR CHAR, BPCHAR, TEXT, STRING 가변 길이 문자 문자열

수많은 타입 간의 암시적 및 명시적 타입 캐스팅이 가능해요. 자세한 내용은 [Typecasting]({% link docs/current/sql/data_types/typecasting.md %}) 페이지를 참고하세요.

중첩 / 복합 타입 (Nested / Composite Types)

DuckDB는 다섯 가지 중첩 데이터 타입을 지원해요: ARRAY, LIST, MAP, STRUCT, UNION. 각각 다른 사용 사례를 지원하고 다른 구조를 가져요.

이름 설명 (Description) 컬럼에서 사용될 때의 규칙 (Rules when used in a column) 값에서 빌드 (Build from values) DDL/CREATE에서 정의 (Define in DDL/CREATE)
[ARRAY]({% link docs/current/sql/data_types/array.md %}) 같은 타입의 데이터 값들의 정렬된, 고정 길이 시퀀스. 각 행은 ARRAY의 각 인스턴스 안에서 같은 데이터 타입과 같은 수의 요소를 가져야 해요. [1, 2, 3] INTEGER[3]
[LIST]({% link docs/current/sql/data_types/list.md %}) 같은 타입의 데이터 값들의 정렬된 시퀀스. 각 행은 LIST의 각 인스턴스 안에서 같은 데이터 타입이어야 하지만, 요소 수는 아무거나 될 수 있어요. [1, 2, 3] INTEGER[]
[MAP]({% link docs/current/sql/data_types/map.md %}) 여러 named 값의 딕셔너리로, 각 키는 같은 타입이고 각 값은 같은 타입이에요. 키와 값은 어떤 타입이든 될 수 있고 서로 다른 타입이어도 돼요. 행마다 다른 키를 가질 수 있어요. map([1, 2], ['a', 'b']) MAP(INTEGER, VARCHAR)
[STRUCT]({% link docs/current/sql/data_types/struct.md %}) 여러 named 값의 딕셔너리로, 각 키는 문자열이지만 키마다 값 타입이 다를 수 있어요. 각 행은 같은 키를 가져야 해요. {'i': 42, 'j': 'a'} STRUCT(i INTEGER, j VARCHAR)
[UNION]({% link docs/current/sql/data_types/union.md %}) 여러 대체 데이터 타입의 결합으로, 각 값에 한 번에 그중 하나를 저장해요. union은 현재 설정된 멤버 타입을 검사하고 접근하기 위한 판별자 "tag" 값도 포함해요. 행마다 union의 다른 멤버 타입으로 설정될 수 있어요. union_value(num := 2) UNION(num INTEGER, text VARCHAR)
[VARIANT]({% link docs/current/sql/data_types/variant.md %}) 각 값이 자신의 타입 정보와 함께 자립적인 반구조화(semi-structured) 타입. 각 행은 다른 타입의 값을 담을 수 있어요. 42::VARIANT VARIANT

대소문자 구분 규칙 (Rules for Case Sensitivity)

MAP의 키는 대소문자를 구분하지만, UNIONSTRUCT의 키는 대소문자를 구분하지 않아요. 예시는 [Rules for Case Sensitivity 섹션]({% link docs/current/sql/dialect/overview.md %}#case-sensitivity-of-keys-in-nested-data-structures)을 참고하세요.

중첩 타입 값 업데이트 (Updating Values of Nested Types)

중첩 타입의 값에 대해 _업데이트_를 수행할 때 DuckDB는 삭제 연산 후 삽입 연산을 수행해요. 명시적 인덱스나 기본 키/유니크 제약을 통해 ART 인덱스가 있는 테이블에서 사용하면 [예상치 못한 제약 위반]({% link docs/current/sql/indexes.md %}#constraint-checking-in-update-statements)이 발생할 수 있어요.

중첩 (Nesting)

ARRAY, LIST, MAP, STRUCT, UNION 타입은 타입 규칙을 지키는 한 어떤 깊이든 임의로 중첩될 수 있어요.

LIST를 가진 Struct:

SELECT {'birds': ['duck', 'goose', 'heron'], 'aliens': NULL, 'amphibians': ['frog', 'toad']};

MAP의 목록을 가진 Struct:

SELECT {'test': [MAP([1, 5], [42.1, 45]), MAP([1, 5], [42.1, 45])]};

UNION의 목록:

SELECT [union_value(num := 2), union_value(str := 'ABC')::UNION(str VARCHAR, num INTEGER)];

성능 영향 (Performance Implications)

데이터 타입의 선택은 성능에 큰 영향을 줄 수 있어요. 자세한 내용은 [Performance Guide]({% link docs/current/guides/performance/schema.md %})를 참고하세요.

더 알아보기 (Learn more)