생성된 UUID에는 Unix 밀리초 단위의 48비트 타임스탬프가 포함되며, 그 뒤에 버전 “7”(4비트), 동일한 밀리초 내에서 UUID를 구분하기 위한 카운터(42비트, variant 필드 “2”의 2비트 포함), 그리고 랜덤 필드(32비트)가 이어집니다.
주어진 타임스탬프(unix_ts_ms)에서 카운터는 임의의 값으로 시작하며, 타임스탬프가 바뀔 때까지 새 UUID가 생성될 때마다 1씩 증가합니다. 카운터에 오버플로우가 발생하면 타임스탬프 필드는 1 증가하고, 카운터는 새로운 임의의 시작 값으로 재설정됩니다.
UUID 생성 함수는 동시에 실행되는 스레드 및 쿼리의 모든 함수 호출에 걸쳐, 동일한 타임스탬프 내의 카운터 필드가 단조 증가하도록 보장합니다.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
| unix_ts_ms |
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
| unix_ts_ms | ver | counter_high_bits |
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
|var| counter_low_bits |
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
| rand_b |
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
생성된 Snowflake ID에는 현재 Unix 타임스탬프가 밀리초 단위로 들어 있으며(상위 0 비트 41 + 1개), 그 뒤에 머신 ID(10비트)와 1밀리초 내에서 ID를 구분하기 위한 카운터(12비트)가 이어집니다. 각 타임스탬프(unix_ts_ms)에 대해 카운터는 0에서 시작하며, 타임스탬프가 바뀔 때까지 새 Snowflake ID가 생성될 때마다 1씩 증가합니다. 카운터에 오버플로우가 발생하면 타임스탬프 필드가 1 증가하고 카운터는 0으로 재설정됩니다.
생성된 Snowflake ID는 UNIX epoch 1970-01-01을 기준으로 합니다. Snowflake ID의 epoch에 대한 표준이나 권고는 없지만, 다른 시스템의 구현은 서로 다른 epoch를 사용할 수 있습니다. 예를 들어 Twitter/X는 2010-11-04, Mastodon은 2015-01-01을 사용합니다.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
|0| timestamp |
├─┼ ┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
| | machine_id | machine_seq_num |
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
도입 버전: v1.1.0
UUID의 이진 표현을 입력받고, 필요에 따라 variant로 포맷을 지정할 수 있습니다(기본값은 Big-endian). 텍스트 포맷의 36자 문자열을 반환합니다.
구문
UUIDNumToString(binary[, variant])
인수
반환 값
UUID를 문자열로 반환합니다. String
예시
사용 예시
SELECT
'a/<@];!~p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16)) AS uuid
┌─bytes────────────┬─uuid─────────────────────────────────┐
│ a/<@];!~p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└──────────────────┴──────────────────────────────────────┘
Microsoft 변형
SELECT
'@</a;]~!p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16), 2) AS uuid
┌─bytes────────────┬─uuid─────────────────────────────────┐
│ @</a;]~!p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└──────────────────┴──────────────────────────────────────┘
도입 버전: v1.1.0
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 포맷의 36자 문자열을 받아 해당 문자열의 바이너리 표현인 FixedString(16)을 반환합니다. 포맷은 variant로 선택적으로 지정할 수 있으며 기본값은 Big-endian입니다.
구문
UUIDStringToNum(string[, variant = 1])
인수
반환 값
string의 이진 표현을 반환합니다. FixedString(16)
예시
사용 예시
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
Microsoft 변형
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid, 2) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ @</a;]~!p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
도입 버전: v24.5.0
UUID를 받아 해당 이진 표현을 FixedString(16)으로 반환하며, variant로 포맷을 선택적으로 지정할 수 있습니다(기본값은 Big-endian).
이 함수는 별도의 두 함수 호출인 UUIDStringToNum(toString(uuid))를 대체하므로, UUID에서 바이트를 추출하기 위해 UUID를 문자열로 중간 변환할 필요가 없습니다.
구문
UUIDToNum(uuid[, variant = 1])
인수
반환 값
UUID의 이진 표현을 반환합니다. FixedString(16)
예시
사용 예시
SELECT
toUUID('612f3c40-5d3b-217e-707b-6a546a3d7b29') AS uuid,
UUIDToNum(uuid) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
Microsoft 변형
SELECT
toUUID('612f3c40-5d3b-217e-707b-6a546a3d7b29') AS uuid,
UUIDToNum(uuid, 2) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ @</a;]~!p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
도입 버전: v24.5.0
UUID 버전 7의 타임스탬프 구성 요소를 반환합니다.
구문
UUIDv7ToDateTime(uuid[, timezone])
인수
반환 값
밀리초 정밀도의 타임스탬프를 반환합니다. UUID가 유효한 버전 7 UUID가 아니면 1970-01-01 00:00:00.000을 반환합니다. DateTime64(3)
예시
사용 예시
SELECT UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'))
┌─UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'))─┐
│ 2024-04-22 15:30:29.048 │
└──────────────────────────────────────────────────────────────────┘
시간대 포함
SELECT UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'), 'America/New_York')
┌─UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'), 'America/New_York')─┐
│ 2024-04-22 11:30:29.048 │
└─────────────────────────────────────────────────────────────────────────────────────┘
도입 버전: v21.10.0
DateTime64를 지정된 시각에 해당하는 첫 번째 Snowflake ID로 변환합니다.
구문
dateTime64ToSnowflake(value)
인수
반환 값
입력 값을 해당 시점의 첫 번째 Snowflake ID로 변환한 값을 반환합니다. Int64
예시
사용 예시
WITH toDateTime64('2021-08-15 18:57:56.492', 3, 'Asia/Shanghai') AS dt64 SELECT dateTime64ToSnowflake(dt64);
┌─dateTime64ToSnowflake(dt64)─┐
│ 1426860704886947840 │
└─────────────────────────────┘
도입 버전: v24.6.0
DateTime64 값을 지정된 시점에 해당하는 첫 번째 Snowflake ID로 변환합니다.
구문
dateTime64ToSnowflakeID(value[, epoch])
인수
value — 날짜 및 시간. DateTime64
epoch — 1970-01-01부터 경과한 시간을 밀리초 단위로 나타낸 Snowflake ID의 epoch입니다. 기본값은 0(1970-01-01)입니다. Twitter/X epoch(2015-01-01)를 사용하려면 1288834974657을 지정하십시오. UInt*
반환 값
입력 값을 UInt64로 변환한 값입니다.
예시
simple
SELECT dateTime64ToSnowflakeID(toDateTime64('2021-08-15 18:57:56', 3, 'Asia/Shanghai'))
도입 버전: v21.10.0
DateTime 값을 지정된 시점의 첫 번째 Snowflake ID로 변환합니다.
구문
dateTimeToSnowflake(value)
인수
반환 값
입력 값을 해당 시점의 첫 번째 Snowflake ID로 반환합니다. Int64
예시
사용 예시
WITH toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt SELECT dateTimeToSnowflake(dt);
┌─dateTimeToSnowflake(dt)─┐
│ 1426860702823350272 │
└─────────────────────────┘
도입 버전: v24.6.0
DateTime 값을 주어진 시각의 첫 번째 Snowflake ID로 변환합니다.
구문
dateTimeToSnowflakeID(value[, epoch])
인수
value — 시간이 포함된 날짜입니다. DateTime
epoch — 1970-01-01부터 경과한 밀리초 단위의 Snowflake ID epoch입니다. 기본값은 0(1970-01-01)입니다. Twitter/X epoch(2015-01-01)에는 1288834974657을 지정하십시오. UInt*
반환 값
입력 값이 UInt64로 변환됩니다.
예시
간단한 예시
SELECT dateTimeToSnowflakeID(toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai'))
도입 버전: v25.8.0
지정된 시점의 DateTime 값을 UUIDv7로 변환합니다.
UUID 구조, 카운터 관리, 동시성 보장에 대한 자세한 내용은 “UUIDv7 생성” 섹션을 참조하십시오.
2025년 9월 기준으로 버전 7 UUID는 초안 상태이며, 향후 내부 레이아웃이 변경될 수 있습니다.
구문
인수
반환 값
UUIDv7를 반환합니다. UUID
예시
사용 예시
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai'));
┌─dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai'))─┐
│ 018f05af-f4a8-778f-beee-1bedbc95c93b │
└─────────────────────────────────────────────────────────────────────────┘
동일한 타임스탬프에 여러 UUID
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56'));
SELECT dateTimeToUUIDv7(toDateTime('2021-08-15 18:57:56'));
┌─dateTimeToUUIDv7(t⋯08-15 18:57:56'))─┐
│ 017b4b2d-7720-76ed-ae44-bbcc23a8c550 │
└──────────────────────────────────────┘
┌─dateTimeToUUIDv7(t⋯08-15 18:57:56'))─┐
│ 017b4b2d-7720-76ed-ae44-bbcf71ed0fd3 │
└──────────────────────────────────────┘
도입 버전: v24.6.0
Snowflake ID를 생성합니다.
함수 generateSnowflakeID는 동시에 실행되는 모든 스레드와 쿼리 전반에서 함수가 호출될 때마다 타임스탬프 내 카운터 필드가 단조 증가하도록 보장합니다.
구현 세부 사항은 “Snowflake ID generation” 섹션을 참조하십시오.
구문
generateSnowflakeID([expr, [machine_id]])
인수
expr — 쿼리에서 이 함수가 여러 번 호출될 때 공통 하위 표현식 제거를 우회하는 데 사용되는 임의의 표현식입니다. 표현식 값은 반환되는 Snowflake ID에 영향을 주지 않습니다. 선택 사항입니다. - machine_id — 머신 ID입니다. 하위 10비트가 사용됩니다. Int64. 선택 사항입니다.
반환 값
Snowflake ID를 반환합니다. UInt64
예시
사용 예시
CREATE TABLE tab (id UInt64)
ENGINE = MergeTree()
ORDER BY tuple();
INSERT INTO tab SELECT generateSnowflakeID();
SELECT * FROM tab;
┌──────────────────id─┐
│ 7199081390080409600 │
└─────────────────────┘
행마다 여러 개의 Snowflake ID 생성
SELECT generateSnowflakeID(1), generateSnowflakeID(2);
┌─generateSnowflakeID(1)─┬─generateSnowflakeID(2)─┐
│ 7199081609652224000 │ 7199081609652224001 │
└────────────────────────┴────────────────────────┘
표현식과 머신 ID를 사용
SELECT generateSnowflakeID('expr', 1);
┌─generateSnowflakeID('expr', 1)─┐
│ 7201148511606784002 │
└────────────────────────────────┘
도입된 버전: v1.1.0
버전 4 UUID를 생성합니다.
구문
인수
expr — 선택 사항입니다. 함수가 하나의 쿼리에서 여러 번 호출될 때 공통 하위 표현식 제거을 우회하기 위해 사용하는 임의의 표현식입니다. 이 표현식의 값은 반환되는 UUID에 영향을 주지 않습니다.
반환 값
UUIDv4를 반환합니다. UUID
예시
사용 예시
SELECT generateUUIDv4(number) FROM numbers(3);
┌─generateUUIDv4(number)───────────────┐
│ fcf19b77-a610-42c5-b3f5-a13c122f65b6 │
│ 07700d36-cb6b-4189-af1d-0972f23dc3bc │
│ 68838947-1583-48b0-b9b7-cf8268dd343d │
└──────────────────────────────────────┘
공통 하위 표현식 제거
SELECT generateUUIDv4(1), generateUUIDv4(1);
┌─generateUUIDv4(1)────────────────────┬─generateUUIDv4(2)────────────────────┐
│ 2d49dc6e-ddce-4cd0-afb8-790956df54c1 │ 2d49dc6e-ddce-4cd0-afb8-790956df54c1 │
└──────────────────────────────────────┴──────────────────────────────────────┘
도입 버전: v24.5.0
버전 7 UUID를 생성합니다.
UUID 구조, 카운터 관리, 동시성 보장에 관한 자세한 내용은 “UUIDv7 생성” 섹션을 참조하십시오.
2025년 9월 기준으로 버전 7 UUID는 초안 상태이며, 향후 레이아웃이 변경될 수 있습니다.
구문
인수
expr — 선택 사항입니다. 함수가 한 쿼리에서 여러 번 호출될 때 공통 하위 표현식 제거를 피하기 위해 사용하는 임의의 표현식입니다. 이 표현식의 값은 반환되는 UUID에 영향을 주지 않습니다. Any
반환 값
UUIDv7을 반환합니다. UUID
예시
사용 예시
SELECT generateUUIDv7(number) FROM numbers(3);
┌─generateUUIDv7(number)───────────────┐
│ 019947fb-5766-7ed0-b021-d906f8f7cebb │
│ 019947fb-5766-7ed0-b021-d9072d0d1e07 │
│ 019947fb-5766-7ed0-b021-d908dca2cf63 │
└──────────────────────────────────────┘
공통 하위 표현식 제거
SELECT generateUUIDv7(1), generateUUIDv7(1);
┌─generateUUIDv7(1)────────────────────┬─generateUUIDv7(1)────────────────────┐
│ 019947ff-0f87-7d88-ace0-8b5b3a66e0c1 │ 019947ff-0f87-7d88-ace0-8b5b3a66e0c1 │
└──────────────────────────────────────┴──────────────────────────────────────┘
도입 버전: v24.6.0
Snowflake ID의 타임스탬프 구성 요소를 DateTime 유형의 값으로 반환합니다.
구문
snowflakeIDToDateTime(value[, epoch[, time_zone]])
인수
value — Snowflake ID입니다. UInt64
epoch — 선택 사항입니다. 1970-01-01 이후 경과한 밀리초 단위의 Snowflake ID epoch입니다. 기본값은 0(1970-01-01)입니다. Twitter/X epoch(2015-01-01)의 경우 1288834974657을 지정하십시오. UInt*
time_zone — 선택 사항입니다. 시간대입니다. 함수는 time_string을 시간대에 따라 해석합니다. String
반환 값
value의 timestamp 구성 요소를 반환합니다. DateTime
예시
사용 예시
SELECT snowflakeIDToDateTime(7204436857747984384) AS res
┌─────────────────res─┐
│ 2024-06-06 10:59:58 │
└─────────────────────┘
도입 버전: v24.6.0
Snowflake ID의 타임스탬프 구성 요소를 DateTime64 타입의 값으로 반환합니다.
구문
snowflakeIDToDateTime64(value[, epoch[, time_zone]])
인수
value — Snowflake ID. UInt64
epoch — 선택 사항입니다. 1970-01-01부터 경과한 밀리초 단위의 Snowflake ID epoch입니다. 기본값은 0(1970-01-01)입니다. Twitter/X epoch(2015-01-01)를 사용하려면 1288834974657을 지정하십시오. UInt*
time_zone — 선택 사항입니다. 시간대입니다. 이 함수는 time_string을 해당 시간대에 따라 파싱합니다. String
반환 값
value의 타임스탬프 구성 요소를 scale = 3, 즉 밀리초 정밀도의 DateTime64로 반환합니다. DateTime64
예시
사용 예시
SELECT snowflakeIDToDateTime64(7204436857747984384) AS res
┌─────────────────res─┐
│ 2024-06-06 10:59:58 │
└─────────────────────┘
도입 버전: v21.10.0
Snowflake ID에서 타임스탬프 구성 요소를 DateTime 형식으로 추출합니다.
구문
snowflakeToDateTime(value[, time_zone])
인수
value — Snowflake ID. Int64
time_zone — 선택 사항입니다. 시간대. 함수는 time_string을 해당 시간대에 따라 파싱합니다. String
반환 값
value의 타임스탬프 구성 요소를 반환합니다. DateTime
예시
사용 예시
SELECT snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC');
┌─snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC')─┐
│ 2021-08-15 10:57:56 │
└──────────────────────────────────────────────────────────────────┘
도입 버전: v21.10.0
Snowflake ID의 타임스탬프 부분을 DateTime64 포맷으로 추출합니다.
구문
snowflakeToDateTime64(value[, time_zone])
인수
value — Snowflake ID. Int64
time_zone — 선택 사항입니다. 시간대입니다. 함수는 time_string을 해당 시간대에 따라 해석합니다. String
반환 값
value의 타임스탬프 구성 요소를 반환합니다. DateTime64(3)
예시
사용 예시
SELECT snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC');
┌─snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC')─┐
│ 2021-08-15 10:58:19.841 │
└────────────────────────────────────────────────────────────────────┘
도입 버전: v21.1.0
String 값을 UUID 유형으로 변환합니다. 변환에 실패하면 오류를 발생시키는 대신 기본 UUID 값을 반환합니다.
이 함수는 표준 UUID 포맷(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)의 36자 문자열을 파싱합니다.
문자열을 유효한 UUID로 변환할 수 없으면 제공된 기본 UUID 값을 반환합니다.
구문
toUUIDOrDefault(string, default)
인수
string — UUID로 변환할 36자 String 또는 FixedString(36)입니다. - default — 첫 번째 인수를 UUID 타입으로 변환할 수 없을 때 반환할 UUID 값입니다.
반환 값
변환에 성공하면 변환된 UUID를 반환하고, 변환에 실패하면 기본 UUID를 반환합니다. UUID
예시
변환에 성공하면 파싱된 UUID를 반환합니다
SELECT toUUIDOrDefault('61f0c404-5cb3-11e7-907b-a6006ad3dba0', toUUID('59f0c404-5cb3-11e7-907b-a6006ad3dba0'));
┌─toUUIDOrDefault('61f0c404-5cb3-11e7-907b-a6006ad3dba0', toUUID('59f0c404-5cb3-11e7-907b-a6006ad3dba0'))─┐
│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘
변환이 실패하면 기본 UUID를 반환합니다
SELECT toUUIDOrDefault('-----61f0c404-5cb3-11e7-907b-a6006ad3dba0', toUUID('59f0c404-5cb3-11e7-907b-a6006ad3dba0'));
┌─toUUIDOrDefault('-----61f0c404-5cb3-11e7-907b-a6006ad3dba0', toUUID('59f0c404-5cb3-11e7-907b-a6006ad3dba0'))─┐
│ 59f0c404-5cb3-11e7-907b-a6006ad3dba0 │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
도입 버전: v20.12.0
입력 값을 UUID 타입으로 변환하지만, 오류가 발생하면 NULL을 반환합니다.
toUUID와 유사하지만, 변환 오류 시 예외를 발생시키는 대신 NULL을 반환합니다.
지원되는 인수:
- 표준 포맷(8-4-4-4-12자리 16진수)의 UUID 문자열 표현.
- 하이픈이 없는 UUID 문자열 표현(32자리 16진수).
지원되지 않는 인수(NULL 반환):
- 잘못된 문자열 포맷.
- 문자열이 아닌 타입.
- 잘못된 형식의 UUID.
구문
인수
반환 값
성공하면 UUID 값을 반환하고, 실패하면 NULL을 반환합니다. UUID 또는 NULL
예시
사용 예시
SELECT
toUUIDOrNull('550e8400-e29b-41d4-a716-446655440000') AS valid_uuid,
toUUIDOrNull('invalid-uuid') AS invalid_uuid
┌─valid_uuid───────────────────────────┬─invalid_uuid─┐
│ 550e8400-e29b-41d4-a716-446655440000 │ ᴺᵁᴸᴸ │
└──────────────────────────────────────┴──────────────┘