Функции для работы с UUID
Генерация UUIDv7
Сгенерированный UUID содержит 48-битный таймстамп в миллисекундах Unix-времени, за которым следуют версия «7» (4 бита), счётчик (42 бита) для различения UUID в пределах одной миллисекунды (включая поле варианта «2» — 2 бита) и случайное поле (32 бита).
Для любого заданного таймстампа (unix_ts_ms) счётчик начинается со случайного значения и увеличивается на 1 для каждого нового UUID до тех пор, пока таймстамп не изменится. В случае переполнения счётчика поле таймстампа увеличивается на 1, а счётчик сбрасывается на новое случайное начальное значение.
Функции генерации UUID гарантируют, что поле счётчика в пределах одного таймстампа монотонно возрастает во всех вызовах функции в параллельно выполняющихся потоках и запросах.
Генерация Snowflake ID
Сгенерированный Snowflake ID содержит текущую Unix-метку времени в миллисекундах (41 бит + 1 старший нулевой бит), за которой следуют идентификатор машины (10 бит) и счётчик (12 бит) для различения идентификаторов в пределах одной миллисекунды. Для любой заданной метки времени (unix_ts_ms) счётчик начинается с 0 и увеличивается на 1 для каждого нового Snowflake ID до изменения метки времени. В случае переполнения счётчика поле метки времени увеличивается на 1, а счётчик сбрасывается в 0.
Сгенерированные Snowflake ID основаны на эпохе UNIX 1970-01-01. Хотя не существует стандарта или рекомендаций для эпохи Snowflake ID, реализации в других системах могут использовать другую эпоху, например Twitter/X (2010-11-04) или Mastodon (2015-01-01).
generateUUIDv4
Синтаксис
Аргументы
expr— Произвольное выражение, используемое для обхода устранения общих подвыражений при многократном вызове функции в одном запросе. Значение выражения не влияет на возвращаемый UUID. Необязательный параметр.
Возвращаемое значение
Значение типа UUIDv4.
Пример
Сначала создайте таблицу со столбцом типа UUID, затем вставьте сгенерированный UUIDv4 в эту таблицу.
Результат:
Пример, в котором для каждой строки генерируется несколько UUID
generateUUIDv7
Генерирует UUID версии 7 (UUID).
См. раздел "Генерация UUIDv7" для подробностей о структуре UUID, управлении счётчиком и гарантиях при конкурентном доступе.
По состоянию на апрель 2024 года UUID версии 7 имеют статус черновика, и их структура в будущем может измениться.
Синтаксис
Аргументы
expr— Произвольное выражение, позволяющее обойти устранение общих подвыражений, если функция вызывается несколько раз в запросе. Значение выражения не влияет на возвращаемый UUID. Необязательный параметр.
Возвращаемое значение
Значение типа UUIDv7.
Пример
Сначала создайте таблицу со столбцом типа UUID, затем вставьте сгенерированный UUIDv7 в таблицу.
Результат:
Пример с несколькими UUID, генерируемыми для каждой строки
dateTimeToUUIDv7
Преобразует значение DateTime в UUIDv7 на заданный момент времени.
См. раздел «UUIDv7 generation» для подробностей о структуре UUID, управлении счётчиком и гарантиях корректной работы при конкурентном доступе.
По состоянию на апрель 2024 года UUID версии 7 имеют статус черновика, и их структура может измениться в будущем.
Синтаксис
Аргументы
value— Дата и время. DateTime.
Возвращаемое значение
Значение типа UUIDv7.
Пример
Результат:
Пример с несколькими UUID для одной и той же временной метки
Результат
Функция гарантирует, что несколько вызовов с одинаковым значением временной метки генерируют уникальные, монотонно возрастающие UUID.
empty
Проверяет, является ли переданный UUID пустым.
Синтаксис
UUID считается пустым, если он состоит полностью из нулей (нулевой UUID).
Функция также работает для массивов и строк.
Аргументы
x— UUID. UUID.
Возвращаемое значение
- Возвращает
1для пустого UUID или0для непустого UUID. UInt8.
Пример
Чтобы сгенерировать значение UUID, ClickHouse предоставляет функцию generateUUIDv4.
Запрос:
Результат:
notEmpty
Проверяет, что переданный UUID не пустой.
Синтаксис
UUID считается пустым, если он состоит полностью из нулей (нулевой UUID).
Функция также работает для массивов и строк.
Аргументы
x— UUID. UUID.
Возвращаемое значение
- Возвращает
1для непустого UUID или0для пустого UUID. UInt8.
Пример
Для генерации значения UUID в ClickHouse предусмотрена функция generateUUIDv4.
Запрос:
Результат:
toUUID
Преобразует значение типа String в значение типа UUID.
Возвращаемое значение
Значение типа UUID.
Пример использования
Результат:
toUUIDOrDefault
Аргументы
string— строка длиной 36 символов или FixedString(36). String.default— UUID, используемый по умолчанию, если первый аргумент не может быть преобразован в тип UUID. UUID.
Возвращаемое значение
UUID
Возвращаемое значение
Значение типа UUID.
Примеры использования
В этом первом примере возвращается первый аргумент, преобразованный к типу UUID, так как его можно привести к этому типу:
Результат:
Этот второй пример возвращает второй аргумент (указанный UUID по умолчанию), поскольку первый аргумент нельзя привести к типу UUID:
Результат:
toUUIDOrNull
Принимает аргумент типа String и пытается преобразовать его в UUID. Если преобразование не удалось, возвращает NULL.
Возвращаемое значение
Значение типа Nullable(UUID).
Пример использования
Результат:
toUUIDOrZero
Принимает аргумент типа String и пытается преобразовать его в UUID. Если преобразование не удаётся, возвращает нулевой UUID.
Возвращаемое значение
Значение типа UUID.
Пример использования
Результат:
UUIDStringToNum
Принимает строку типа string, содержащую 36 символов в формате xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, и возвращает FixedString(16) в виде её двоичного представления, формат которого может быть дополнительно задан параметром variant (по умолчанию Big-endian).
Синтаксис
Аргументы
string— String из 36 символов или FixedStringvariant— целое число, задающее вариант в соответствии с RFC4122. 1 =Big-endian(по умолчанию), 2 =Microsoft.
Возвращаемое значение
FixedString(16)
Примеры использования
Результат:
Результат:
UUIDNumToString
Принимает значение типа binary, содержащее двоичное представление UUID (его формат можно дополнительно указать параметром variant, по умолчанию используется Big-endian), и возвращает строку из 36 символов в текстовом формате.
Синтаксис
Аргументы
binary— FixedString(16) как двоичное представление UUID.variant— целое число, представляющее вариант, как указано в RFC4122. 1 =Big-endian(по умолчанию), 2 =Microsoft.
Возвращаемое значение
Строка.
Пример использования
Результат:
Результат:
UUIDToNum
Принимает UUID и возвращает его двоичное представление в виде FixedString(16); формат двоичного представления может быть дополнительно указан параметром variant (по умолчанию Big-endian). Эта функция заменяет вызовы двух отдельных функций вида UUIDStringToNum(toString(uuid)), поэтому для извлечения байтов из UUID не требуется промежуточное преобразование UUID в строку.
Синтаксис
Аргументы
uuid— UUID.variant— целое число, представляющее вариант, как указано в RFC4122. 1 =Big-endian(по умолчанию), 2 =Microsoft.
Возвращаемое значение
Двоичное представление UUID.
Примеры использования
Результат:
Результат:
UUIDv7ToDateTime
Возвращает компонент отметки времени из UUID версии 7.
Синтаксис
Аргументы
uuid— UUID версии 7.timezone— название часового пояса для возвращаемого значения (необязательный параметр). String.
Возвращаемое значение
- Временная метка с точностью до миллисекунд. Если UUID не является корректным UUID версии 7, возвращается 1970-01-01 00:00:00.000. DateTime64(3).
Примеры использования
Результат:
Результат:
serverUUID
Возвращает случайный UUID, сгенерированный при первом запуске сервера ClickHouse. UUID хранится в файле uuid в каталоге сервера ClickHouse (например, /var/lib/clickhouse/) и сохраняется между перезапусками сервера.
Синтаксис
Возвращаемое значение
- UUID сервера. UUID.
generateSnowflakeID
Генерирует Snowflake ID. Эта функция гарантирует, что поле счётчика внутри метки времени монотонно увеличивается при всех вызовах функции в одновременно выполняющихся потоках и запросах.
См. раздел "Генерация Snowflake ID" для подробных сведений о реализации.
Синтаксис
Аргументы
expr— Произвольное выражение, используемое для обхода механизма устранения общих подвыражений, если функция вызывается несколько раз в одном запросе. Значение выражения не влияет на возвращаемый Snowflake ID. Необязательный параметр.machine_id— Идентификатор машины, используются младшие 10 бит. Int64. Необязательный параметр.
Возвращаемое значение
Значение типа UInt64.
Пример
Сначала создайте таблицу со столбцом типа UInt64, затем вставьте в неё сгенерированный Snowflake ID.
Результат:
Пример с несколькими Snowflake ID, создаваемыми для каждой строки
Пример с выражением и идентификатором хоста
snowflakeToDateTime
Эта функция устарела и может использоваться только в том случае, если включена настройка allow_deprecated_snowflake_conversion_functions. Функция будет удалена в будущем.
Вместо неё используйте функцию snowflakeIDToDateTime.
Извлекает компонент временной метки из Snowflake ID в формате DateTime.
Синтаксис
Аргументы
value— идентификатор Snowflake. Int64.time_zone— часовой пояс. Функция разбираетtime_stringв соответствии с часовым поясом. Необязательный параметр. String.
Возвращаемое значение
- Компонент метки времени значения
valueв виде значения DateTime.
Пример
Запрос:
Результат:
snowflakeToDateTime64
Эта функция устарела и может использоваться только в том случае, если включена настройка allow_deprecated_snowflake_conversion_functions. Функция будет удалена в будущем.
Используйте вместо неё функцию snowflakeIDToDateTime64.
Извлекает компонент метки времени из Snowflake ID в формате DateTime64.
Синтаксис
Аргументы
value— Snowflake ID. Int64.time_zone— Timezone. Функция разбираетtime_stringв соответствии с часовым поясом. Необязательный параметр. String.
Возвращаемое значение
- Компонента временной метки
valueв формате DateTime64 с масштабом = 3, то есть с точностью до миллисекунды.
Пример
Запрос:
Результат:
dateTimeToSnowflake
Эта функция устарела и может использоваться только в том случае, если включён параметр allow_deprecated_snowflake_conversion_functions. Функция будет удалена в какой‑то момент в будущем.
Пожалуйста, используйте вместо неё функцию dateTimeToSnowflakeID.
Преобразует значение DateTime в первый Snowflake ID в заданный момент времени.
Синтаксис
Аргументы
value— дата и время. DateTime.
Возвращаемое значение
- Входное значение, преобразованное в тип данных Int64 как первый идентификатор Snowflake в этот момент времени.
Пример
Запрос:
Результат:
dateTime64ToSnowflake
Эта функция устарела и может использоваться только если включена настройка allow_deprecated_snowflake_conversion_functions. Функция будет удалена в будущем.
Используйте вместо неё функцию dateTime64ToSnowflakeID.
Преобразует DateTime64 в первый Snowflake ID в указанный момент времени.
Синтаксис
Аргументы
value— дата и время. DateTime64.
Возвращаемое значение
- Входное значение, преобразованное к типу данных Int64 как первый идентификатор Snowflake для этого момента времени.
Пример
Запрос:
Результат:
snowflakeIDToDateTime
Возвращает компонент отметки времени Snowflake ID в виде значения типа DateTime.
Синтаксис
Аргументы
value— Snowflake ID. UInt64.epoch— эпоха Snowflake ID в миллисекундах, отсчитанных с 1970-01-01. По умолчанию — 0 (1970-01-01). Для эпохи Twitter/X (2015-01-01) укажите 1288834974657. Необязательный параметр. UInt*.time_zone— Timezone. Функция интерпретируетtime_stringв соответствии с часовым поясом. Необязательный параметр. String.
Возвращаемое значение
- Компонент временной метки значения
valueв виде значения DateTime.
Пример
Запрос:
Результат:
snowflakeIDToDateTime64
Возвращает компонент временной метки Snowflake ID в виде значения типа DateTime64.
Синтаксис
Аргументы
value— идентификатор Snowflake. UInt64.epoch— эпоха идентификаторов Snowflake в миллисекундах, прошедших с 1970-01-01. По умолчанию — 0 (1970-01-01). Для эпохи Twitter/X (2015-01-01) укажите 1288834974657. Необязательный параметр. UInt*.time_zone— Timezone. Функция разбираетtime_stringв соответствии с указанным часовым поясом. Необязательный параметр. String.
Возвращаемое значение
- Компонент метки времени из
valueв виде DateTime64 с scale = 3, то есть с точностью до миллисекунд.
Пример
Запрос:
Результат:
dateTimeToSnowflakeID
Преобразует значение DateTime в первый Snowflake ID для заданного момента времени.
Синтаксис
Аргументы
value— дата и время. DateTime.epoch— эпоха для Snowflake ID в миллисекундах, прошедших с 1970-01-01. По умолчанию 0 (1970-01-01). Для эпохи Twitter/X (2015-01-01) используйте 1288834974657. Необязательный параметр. UInt*.
Возвращаемое значение
- Входное значение, преобразованное в UInt64 как первый Snowflake ID для этого момента времени.
Пример
Запрос:
Результат:
dateTime64ToSnowflakeID
Преобразует DateTime64 в первый Snowflake ID в заданный момент времени.
Синтаксис
Аргументы
value— дата и время. DateTime64.epoch— эпоха Snowflake ID в миллисекундах, отсчитываемая от 1970-01-01. По умолчанию — 0 (1970-01-01). Для эпохи Twitter/X (2015-01-01) укажите 1288834974657. Необязательный параметр. UInt*.
Возвращаемое значение
- Входное значение, преобразованное в UInt64 как значение первого Snowflake ID для этого момента времени.
Пример
Запрос:
Результат: