FixedString 데이터 타입

FixedString 데이터 타입

N 바이트(문자나 코드 포인트가 아니라 바이트 단위)의 고정 길이 문자열 타입이에요. 데이터 길이가 정확히 N 바이트일 때 효율적이고, 그 외의 경우엔 효율이 떨어질 수 있어요.

출처: 문서

본문

N 바이트의 고정 길이 문자열이에요(문자나 코드 포인트가 아니라 바이트 단위). FixedString 타입 컬럼을 선언하려면 다음 문법을 사용해요.

<column_name> FixedString(N)

여기서 N은 자연수예요.

FixedString 타입은 데이터 길이가 정확히 N 바이트일 때 효율적이에요. 그 외의 모든 경우에는 효율이 떨어질 가능성이 있어요. FixedString 타입 컬럼에 효율적으로 저장할 수 있는 값의 예는 다음과 같아요.

  • IP 주소의 이진 표현(IPv6의 경우 FixedString(16))
  • 언어 코드(ru_RU, en_US, …)
  • 통화 코드(USD, RUB, …)
  • 해시의 이진 표현(MD5FixedString(16), SHA256FixedString(32))

UUID 값을 저장하려면 UUID 데이터 타입을 사용해요.

데이터를 넣을 때 ClickHouse는:

  • 문자열이 N 바이트보다 적으면 null 바이트로 보충해요.
  • 문자열이 N 바이트보다 많으면 Too large value for FixedString(N) 예외를 던져요.

단일 FixedString(2) 컬럼이 있는 다음 테이블을 생각해 볼게요.

INSERT INTO FixedStringTable VALUES ('a'), ('ab'), ('');
SELECT
    name,
    toTypeName(name),
    length(name),
    empty(name)
FROM FixedStringTable;
┌─name─┬─toTypeName(name)─┬─length(name)─┬─empty(name)─┐
│ a    │ FixedString(2)   │            2 │           0 │
│ ab   │ FixedString(2)   │            2 │           0 │
│      │ FixedString(2)   │            2 │           1 │
└──────┴──────────────────┴──────────────┴─────────────┘

FixedString(N) 값의 길이는 상수라는 점을 주목하세요. length 함수는 FixedString(N) 값이 null 바이트로만 채워져 있어도 N을 반환하지만, empty 함수는 이 경우 1을 반환해요.

WHERE 절로 데이터를 조회하면 조건을 어떻게 지정했는지에 따라 결과가 달라져요.

  • 동등 연산자 = 또는 == 또는 equals 함수를 사용하면 ClickHouse는 \0 문자를 고려하지 않아요. 즉 SELECT * FROM FixedStringTable WHERE name = 'a';SELECT * FROM FixedStringTable WHERE name = 'a\0';는 같은 결과를 반환해요.

  • LIKE 절을 사용하면 ClickHouse는 \0 문자를 고려해요. 그래서 필터 조건에 \0 문자를 명시적으로 지정해야 할 수 있어요.

SELECT name
FROM FixedStringTable
WHERE name = 'a'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name = 'a\0'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name = 'a'
FORMAT JSONStringsEachRow

Query id: c32cec28-bb9e-4650-86ce-d74a1694d79e

{"name":"a\u0000"}

SELECT name
FROM FixedStringTable
WHERE name LIKE 'a'
FORMAT JSONStringsEachRow

0 rows in set.

SELECT name
FROM FixedStringTable
WHERE name LIKE 'a\0'
FORMAT JSONStringsEachRow

{"name":"a\u0000"}

더 알아보기 (Learn more)