Nullable 데이터 타입

Nullable 데이터 타입

T가 허용하는 정상 값과 함께 "누락된 값(missing value)"을 나타내는 특별한 마커(NULL)를 저장할 수 있게 해주는 타입이에요. 예를 들어 Nullable(Int8) 타입 컬럼은 Int8 타입 값을 저장할 수 있고, 값이 없는 행은 NULL을 저장해요.

출처: 문서

본문

T가 허용하는 정상 값 옆에 "누락된 값"을 나타내는 특별한 마커(NULL)를 저장할 수 있게 해줘요. 예를 들어 Nullable(Int8) 타입 컬럼은 Int8 타입 값을 저장할 수 있고, 값이 없는 행은 NULL을 저장해요.

T는 다음 복합 데이터 타입 중 하나일 수 없어요.

하지만 복합 데이터 타입은 Nullable 타입 값을 담을 수 있어요. 예를 들어 Array(Nullable(Int8)) 또는 Tuple(Nullable(String), Nullable(Int64)) 같은 식이에요. Nullable 타입 필드는 테이블 인덱스에 포함될 수 없어요. NULL은 ClickHouse 서버 설정에서 달리 지정하지 않는 한 모든 Nullable 타입의 기본값이에요.

저장 특성 (Storage Features)

Nullable 타입 값을 테이블 컬럼에 저장하기 위해 ClickHouse는 값이 있는 일반 파일에 더해 NULL 마스크가 있는 별도의 파일을 사용해요. 마스크 파일의 항목은 ClickHouse가 각 테이블 행에 대해 NULL과 해당 데이터 타입의 기본값을 구분하게 해줘요. 추가 파일 때문에 Nullable 컬럼은 비슷한 일반 컬럼에 비해 더 많은 저장 공간을 소비해요. Nullable을 사용하면 거의 항상 성능에 부정적 영향을 주므로, 데이터베이스를 설계할 때 이 점을 명심하세요.

NULL 찾기 (Finding NULL)

전체 컬럼을 읽지 않고 null 서브컬럼을 사용해 컬럼에서 NULL 값을 찾을 수 있어요. 저장된 NULL 마스크 바이트를 반환하는데, 해당 값이 있으면 0, NULL이면 0이 아닌 바이트(표준적으로 1)를 반환해요. 엄격한 0 또는 1이 필요하면 isNull을 사용해요.

예시 (Example)

쿼리:

CREATE TABLE nullable (`n` Nullable(UInt32)) ENGINE = MergeTree ORDER BY tuple();

INSERT INTO nullable VALUES (1) (NULL) (2) (NULL);

SELECT n.null FROM nullable;

응답:

┌─n.null─┐
│      0 │
│      1 │
│      0 │
│      1 │
└────────┘

사용 예시 (Usage Example)

CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
INSERT INTO t_null VALUES (1, NULL), (2, 3)
SELECT x + y FROM t_null
┌─plus(x, y)─┐
│       ᴺᵁᴸᴸ │
│          5 │
└────────────┘

더 알아보기 (Learn more)