'string' = integer 쌍 또는 'string' 이름으로 선언할 수 있습니다. ClickHouse는 숫자만 저장하지만, 이름을 통해 이러한 값을 대상으로 연산할 수 있습니다.
ClickHouse는 다음을 지원합니다.
- 8비트
Enum:[-128, 127]범위에서 열거된 값을 최대 256개까지 포함할 수 있습니다. - 16비트
Enum:[-32768, 32767]범위에서 열거된 값을 최대 65536개까지 포함할 수 있습니다.
Enum 타입을 자동으로 선택합니다. 저장 크기를 명확하게 지정하려면 Enum8 또는 Enum16 타입을 사용할 수도 있습니다.
사용 예시
Enum8('hello' = 1, 'world' = 2) 타입의 컬럼이 있는 테이블을 생성합니다:
x에는 타입 정의에 나열된 값, 즉 'hello' 또는 'world'만 저장할 수 있습니다. 다른 값을 저장하려고 하면 예외가 발생합니다. 이 Enum의 크기는 자동으로 8비트로 선택됩니다.
Enum의 문자열 값을 출력합니다.
Enum 값을 정수형으로 캐스팅해야 합니다.
CAST도 사용해야 합니다.
일반 규칙 및 사용법
Enum8의 경우 -128 ... 127, Enum16의 경우 -32768 ... 32767 범위의 숫자가 할당됩니다. 모든 문자열과 숫자 값은 서로 달라야 합니다. 빈 문자열은 허용됩니다. 이 타입이 지정된 경우(테이블 정의에서) 숫자는 임의의 순서로 지정할 수 있습니다. 하지만 순서는 중요하지 않습니다.
Enum의 문자열 값이나 숫자 값은 NULL일 수 없습니다.
Enum은 널 허용 타입에 포함될 수 있습니다. 따라서 쿼리를 사용하여 테이블을 생성하면
'hello'와 'world'뿐만 아니라 NULL도 저장할 수 있습니다.
Enum 컬럼은 해당 숫자 값의 Int8 또는 Int16과 같은 방식으로 저장됩니다.
텍스트 형식으로 읽을 때 ClickHouse는 값을 문자열로 파싱한 다음 Enum 값 집합에서 해당 문자열을 찾습니다. 찾지 못하면 예외가 발생합니다. 텍스트 포맷으로 읽을 때는 문자열을 읽고 이에 대응하는 숫자 값을 조회합니다. 찾지 못하면 예외가 발생합니다.
텍스트 형식으로 쓸 때는 값을 해당 문자열로 기록합니다. 컬럼 데이터에 잘못된 값(유효한 집합에 속하지 않는 숫자)이 들어 있으면 예외가 발생합니다. 바이너리 형식으로 읽고 쓸 때는 Int8 및 Int16 데이터 타입과 동일하게 동작합니다.
암시적 기본값은 가장 작은 숫자 값을 갖는 값입니다.
ORDER BY, GROUP BY, IN, DISTINCT 등에서 Enum은 해당 숫자 값과 동일하게 동작합니다. 예를 들어 ORDER BY는 Enum을 숫자 기준으로 정렬합니다. 동등 및 비교 연산자도 Enum에서 내부 숫자 값과 동일하게 동작합니다.
Enum 값은 숫자와 비교할 수 없습니다. Enum은 상수 문자열과는 비교할 수 있습니다. 비교 대상 문자열이 Enum의 유효한 값이 아니면 예외가 발생합니다. IN 연산자는 왼쪽에 Enum이 있고 오른쪽에 문자열 집합이 있는 경우 지원됩니다. 이 문자열들은 해당 Enum의 값입니다.
대부분의 숫자 및 문자열 연산은 Enum 값에 대해 정의되어 있지 않습니다. 예를 들어 Enum에 숫자를 더하거나 Enum에 문자열을 연결할 수 없습니다.
하지만 Enum에는 문자열 값을 반환하는 기본 toString 함수가 있습니다.
Enum 값은 T가 숫자 타입일 때 toT 함수를 사용하여 숫자 타입으로 변환할 수도 있습니다. T가 enum의 내부 숫자 타입에 해당하면 이 변환에는 비용이 들지 않습니다.
값 집합만 변경되는 경우 Enum 타입은 ALTER를 사용해 비용 없이 변경할 수 있습니다. ALTER를 사용하면 Enum 멤버를 추가하거나 제거할 수 있습니다(제거는 해당 값이 테이블에서 한 번도 사용된 적이 없을 때만 안전합니다). 안전장치로서, 이전에 정의된 Enum 멤버의 숫자 값을 변경하면 예외가 발생합니다.
ALTER를 사용하면 Int8을 Int16으로 변경하는 것과 마찬가지로 Enum8을 Enum16으로, 또는 그 반대로 변경할 수 있습니다.