Fonctions pour manipuler les UUIDs
L’UUID généré contient un horodatage de 48 bits en millisecondes Unix, suivi de la version “7” (4 bits), d’un compteur (42 bits) permettant de distinguer les UUID au sein d’une même milliseconde (y compris un champ de variante “2”, 2 bits) et d’un champ aléatoire (32 bits).
Pour un horodatage donné (unix_ts_ms), le compteur démarre à une valeur aléatoire et est incrémenté de 1 pour chaque nouvel UUID jusqu’à ce que l’horodatage change. En cas de débordement du compteur, le champ d’horodatage est incrémenté de 1 et le compteur est réinitialisé à une nouvelle valeur de départ aléatoire.
Les fonctions de génération d’UUID garantissent que le champ de compteur, pour un horodatage donné, s’incrémente de façon monotone sur l’ensemble des appels de fonction effectués dans des threads et des requêtes exécutés de manière concurrente.
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 |
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
Génération des Snowflake IDs
Le Snowflake ID généré contient l’horodatage Unix actuel en millisecondes (41 + 1 bits de poids fort à zéro), suivi d’un identifiant de machine (10 bits) et d’un compteur (12 bits) pour distinguer les identifiants au sein d’une même milliseconde. Pour un horodatage donné (unix_ts_ms), le compteur commence à 0 et est incrémenté de 1 pour chaque nouveau Snowflake ID, jusqu’à ce que l’horodatage change. En cas de dépassement de capacité du compteur, le champ d’horodatage est incrémenté de 1 et le compteur est réinitialisé à 0.
Les Snowflake IDs générés sont basés sur l’époque Unix du 1970-01-01. Bien qu’il n’existe aucune norme ni recommandation concernant l’époque des Snowflake IDs, les implémentations dans d’autres systèmes peuvent utiliser une époque différente, par exemple Twitter/X (2010-11-04) ou 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 |
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
Introduit dans : v1.1.0
Prend la représentation binaire d’un UUID, dont le format peut être indiqué de manière facultative par variant (Big-endian par défaut), et renvoie une chaîne de 36 caractères au format texte.
Syntaxe
UUIDNumToString(binary[, variant])
Arguments
binary — Représentation binaire d’un UUID. FixedString(16)
variant — Variante telle que définie par la RFC4122. 1 = Big-endian (par défaut), 2 = Microsoft. (U)Int*
Valeur renvoyée
Renvoyer l’UUID sous forme de chaîne. String
Exemples
Exemple d’utilisation
SELECT
'a/<@];!~p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16)) AS uuid
┌─bytes────────────┬─uuid─────────────────────────────────┐
│ a/<@];!~p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└──────────────────┴──────────────────────────────────────┘
Variante Microsoft
SELECT
'@</a;]~!p{jTj={)' AS bytes,
UUIDNumToString(toFixedString(bytes, 16), 2) AS uuid
┌─bytes────────────┬─uuid─────────────────────────────────┐
│ @</a;]~!p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
└──────────────────┴──────────────────────────────────────┘
Introduite dans : v1.1.0
Accepte une chaîne de 36 caractères au format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx et renvoie un FixedString(16) sous sa représentation binaire, dont le format peut être spécifié via variant (Big-endian par défaut).
Syntaxe
UUIDStringToNum(string[, variant = 1])
Arguments
string — Une chaîne de caractères ou une chaîne de longueur fixe de 36 caractères) String ou FixedString(36)
variant — Variante telle que spécifiée par la RFC4122. 1 = Big-endian (par défaut), 2 = Microsoft. (U)Int*
Valeur renvoyée
Renvoie la représentation binaire de string. FixedString(16)
Exemples
Exemple d’utilisation
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
Variante Microsoft
SELECT
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
UUIDStringToNum(uuid, 2) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ @</a;]~!p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
Introduit dans : v24.5.0
Accepte un UUID et renvoie sa représentation binaire sous la forme d’un FixedString(16), dont le format peut être spécifié via variant (Big-endian par défaut).
Cette fonction remplace les appels combinés aux deux fonctions UUIDStringToNum(toString(uuid)), de sorte qu’aucune conversion intermédiaire de l’UUID en chaîne n’est nécessaire pour extraire les octets d’un UUID.
Syntaxe
UUIDToNum(uuid[, variant = 1])
Arguments
Valeur renvoyée
Renvoie une représentation binaire de l’UUID. FixedString(16)
Exemples
Exemple d’utilisation
SELECT
toUUID('612f3c40-5d3b-217e-707b-6a546a3d7b29') AS uuid,
UUIDToNum(uuid) AS bytes
┌─uuid─────────────────────────────────┬─bytes────────────┐
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
└──────────────────────────────────────┴──────────────────┘
Variante 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={) │
└──────────────────────────────────────┴──────────────────┘
Introduit dans : v24.5.0
Renvoie le composant d’horodatage d’un UUID version 7.
Syntaxe
UUIDv7ToDateTime(uuid[, timezone])
Arguments
Valeur renvoyée
Renvoie un horodatage avec une précision à la milliseconde. Si l’UUID n’est pas un UUID version 7 valide, renvoie 1970-01-01 00:00:00.000. DateTime64(3)
Exemples
Exemple d’utilisation
SELECT UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'))
┌─UUIDv7ToDateTime(toUUID('018f05c9-4ab8-7b86-b64e-c9f03fbd45d1'))─┐
│ 2024-04-22 15:30:29.048 │
└──────────────────────────────────────────────────────────────────┘
Avec fuseau horaire
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 │
└─────────────────────────────────────────────────────────────────────────────────────┘
Introduit dans : v21.10.0
Convertit un DateTime64 en premier Snowflake ID correspondant à l’instant indiqué.
Syntaxe
dateTime64ToSnowflake(value)
Arguments
Valeur renvoyée
Renvoie la valeur d’entrée convertie en premier Snowflake ID correspondant à cet instant. Int64
Exemples
Exemple d’utilisation
WITH toDateTime64('2021-08-15 18:57:56.492', 3, 'Asia/Shanghai') AS dt64 SELECT dateTime64ToSnowflake(dt64);
┌─dateTime64ToSnowflake(dt64)─┐
│ 1426860704886947840 │
└─────────────────────────────┘
Introduit dans : v24.6.0
Convertit une valeur DateTime64 en Snowflake ID initial à l’instant donné.
Syntaxe
dateTime64ToSnowflakeID(value[, epoch])
Arguments
value — Date et heure. DateTime64
epoch — Epoch du Snowflake ID, en millisecondes depuis 1970-01-01. La valeur par défaut est 0 (1970-01-01). Pour l’epoch Twitter/X (2015-01-01), utilisez 1288834974657. UInt*
Valeur renvoyée
Valeur d’entrée convertie en UInt64
Exemples
simple
SELECT dateTime64ToSnowflakeID(toDateTime64('2021-08-15 18:57:56', 3, 'Asia/Shanghai'))
Introduit dans : v21.10.0
Convertit une valeur DateTime en premier Snowflake ID à l’instant donné.
Syntaxe
dateTimeToSnowflake(value)
Arguments
Valeur renvoyée
Renvoie la valeur d’entrée sous forme du premier Snowflake ID à cet instant. Int64
Exemples
Exemple d’utilisation
WITH toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai') AS dt SELECT dateTimeToSnowflake(dt);
┌─dateTimeToSnowflake(dt)─┐
│ 1426860702823350272 │
└─────────────────────────┘
Introduit dans : v24.6.0
Convertit une valeur DateTime en premier Snowflake ID pour l’instant donné.
Syntaxe
dateTimeToSnowflakeID(value[, epoch])
Arguments
value — Date avec heure. DateTime
epoch — Époque du Snowflake ID, en millisecondes depuis 1970-01-01. La valeur par défaut est 0 (1970-01-01). Pour l’époque Twitter/X (2015-01-01), indiquez 1288834974657. UInt*
Valeur renvoyée
Valeur d’entrée convertie en UInt64
Exemples
simple
SELECT dateTimeToSnowflakeID(toDateTime('2021-08-15 18:57:56', 'Asia/Shanghai'))
Introduit dans : v25.8.0
Convertit une valeur DateTime en UUIDv7 pour l’instant donné.
Voir la section “génération d’UUIDv7” pour plus de détails sur la structure des UUID, la gestion du compteur et les garanties de concurrence.
En septembre 2025, les UUID version 7 sont encore à l’état de brouillon et leur structure pourrait évoluer à l’avenir.
Syntaxe
Arguments
Valeur renvoyée
Renvoie un UUIDv7. UUID
Exemples
Exemple d’utilisation
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 │
└─────────────────────────────────────────────────────────────────────────┘
plusieurs UUID pour un même horodatage
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 │
└──────────────────────────────────────┘
Introduit dans : v24.6.0
Génère un Snowflake ID.
La fonction generateSnowflakeID garantit que le champ compteur d’un horodatage s’incrémente de manière monotone sur l’ensemble des invocations de la fonction dans des threads et des requêtes exécutés de manière concurrente.
Voir la section “Génération de Snowflake ID” pour plus de détails sur l’implémentation.
Syntaxe
generateSnowflakeID([expr, [machine_id]])
Arguments
expr — Une expression arbitraire utilisée pour contourner l’élimination des sous-expressions communes si la fonction est appelée plusieurs fois dans une requête. La valeur de l’expression n’a aucun effet sur le Snowflake ID renvoyé. Facultatif. - machine_id — Un ID de machine ; les 10 bits de poids faible sont utilisés. Int64. Facultatif.
Valeur renvoyée
Renvoie le Snowflake ID. UInt64
Exemples
Exemple d’utilisation
CREATE TABLE tab (id UInt64)
ENGINE = MergeTree()
ORDER BY tuple();
INSERT INTO tab SELECT generateSnowflakeID();
SELECT * FROM tab;
┌──────────────────id─┐
│ 7199081390080409600 │
└─────────────────────┘
Plusieurs Snowflake ID générés par ligne
SELECT generateSnowflakeID(1), generateSnowflakeID(2);
┌─generateSnowflakeID(1)─┬─generateSnowflakeID(2)─┐
│ 7199081609652224000 │ 7199081609652224001 │
└────────────────────────┴────────────────────────┘
Avec une expression et un ID de machine
SELECT generateSnowflakeID('expr', 1);
┌─generateSnowflakeID('expr', 1)─┐
│ 7201148511606784002 │
└────────────────────────────────┘
Introduite dans : v1.1.0
Génère un UUID de version 4.
Syntaxe
Arguments
expr — Facultatif. Expression arbitraire utilisée pour contourner l’élimination des sous-expressions communes si la fonction est appelée plusieurs fois dans une requête. La valeur de l’expression n’a aucun effet sur l’UUID renvoyé.
Valeur renvoyée
Renvoie un UUIDv4. UUID
Exemples
Exemple d’utilisation
SELECT generateUUIDv4(number) FROM numbers(3);
┌─generateUUIDv4(number)───────────────┐
│ fcf19b77-a610-42c5-b3f5-a13c122f65b6 │
│ 07700d36-cb6b-4189-af1d-0972f23dc3bc │
│ 68838947-1583-48b0-b9b7-cf8268dd343d │
└──────────────────────────────────────┘
Élimination des sous-expressions communes
SELECT generateUUIDv4(1), generateUUIDv4(1);
┌─generateUUIDv4(1)────────────────────┬─generateUUIDv4(2)────────────────────┐
│ 2d49dc6e-ddce-4cd0-afb8-790956df54c1 │ 2d49dc6e-ddce-4cd0-afb8-790956df54c1 │
└──────────────────────────────────────┴──────────────────────────────────────┘
Introduit dans : v24.5.0
Génère un UUID de version 7.
Voir la section “Génération d’UUIDv7” pour plus de détails sur la structure des UUID, la gestion du compteur et les garanties en cas de génération concurrente.
En septembre 2025, les UUID de version 7 sont encore à l’état de projet, et leur structure pourrait évoluer à l’avenir.
Syntaxe
Arguments
expr — Facultatif. Expression arbitraire utilisée pour contourner l’élimination des sous-expressions communes si la fonction est appelée plusieurs fois dans une requête. La valeur de l’expression n’a aucun effet sur l’UUID renvoyé. Any
Valeur renvoyée
Renvoie un UUIDv7. UUID
Exemples
Exemple d’utilisation
SELECT generateUUIDv7(number) FROM numbers(3);
┌─generateUUIDv7(number)───────────────┐
│ 019947fb-5766-7ed0-b021-d906f8f7cebb │
│ 019947fb-5766-7ed0-b021-d9072d0d1e07 │
│ 019947fb-5766-7ed0-b021-d908dca2cf63 │
└──────────────────────────────────────┘
Élimination de sous-expressions communes
SELECT generateUUIDv7(1), generateUUIDv7(1);
┌─generateUUIDv7(1)────────────────────┬─generateUUIDv7(1)────────────────────┐
│ 019947ff-0f87-7d88-ace0-8b5b3a66e0c1 │ 019947ff-0f87-7d88-ace0-8b5b3a66e0c1 │
└──────────────────────────────────────┴──────────────────────────────────────┘
Introduite dans : v24.6.0
Renvoie le composant d’horodatage d’un Snowflake ID sous la forme d’une valeur de type DateTime.
Syntaxe
snowflakeIDToDateTime(value[, epoch[, time_zone]])
Arguments
value — Snowflake ID. UInt64
epoch — Facultatif. Époque du Snowflake ID, en millisecondes depuis 1970-01-01. La valeur par défaut est 0 (1970-01-01). Pour l’époque de Twitter/X (2015-01-01), indiquez 1288834974657. UInt*
time_zone — Facultatif. Fuseau horaire. La fonction interprète time_string selon le fuseau horaire. String
Valeur renvoyée
Renvoie le composant d’horodatage de value. DateTime
Exemples
Exemple d’utilisation
SELECT snowflakeIDToDateTime(7204436857747984384) AS res
┌─────────────────res─┐
│ 2024-06-06 10:59:58 │
└─────────────────────┘
Introduit dans : v24.6.0
Renvoie le composant d’horodatage d’un Snowflake ID sous forme d’une valeur de type DateTime64.
Syntaxe
snowflakeIDToDateTime64(value[, epoch[, time_zone]])
Arguments
value — Snowflake ID. UInt64
epoch — Facultatif. Époque du Snowflake ID en millisecondes depuis le 1970-01-01. La valeur par défaut est 0 (1970-01-01). Pour l’époque Twitter/X (2015-01-01), indiquez 1288834974657. UInt*
time_zone — Facultatif. Fuseau horaire. La fonction interprète time_string selon le fuseau horaire. String
Valeur renvoyée
Renvoie le composant d’horodatage de value sous la forme d’un DateTime64 avec scale = 3, c’est-à-dire une précision à la milliseconde. DateTime64
Exemples
Exemple d’utilisation
SELECT snowflakeIDToDateTime64(7204436857747984384) AS res
┌─────────────────res─┐
│ 2024-06-06 10:59:58 │
└─────────────────────┘
Introduit dans : v21.10.0
Extrait le composant d’horodatage d’un Snowflake ID au format DateTime.
Syntaxe
snowflakeToDateTime(value[, time_zone])
Arguments
value — Snowflake ID. Int64
time_zone — Facultatif. Fuseau horaire. La fonction interprète time_string en fonction du fuseau horaire. String
Valeur renvoyée
Renvoie le composant d’horodatage de value. DateTime
Exemples
Exemple d’utilisation
SELECT snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC');
┌─snowflakeToDateTime(CAST('1426860702823350272', 'Int64'), 'UTC')─┐
│ 2021-08-15 10:57:56 │
└──────────────────────────────────────────────────────────────────┘
Introduit dans : v21.10.0
Extrait le composant d’horodatage d’un Snowflake ID au format DateTime64.
Syntaxe
snowflakeToDateTime64(value[, time_zone])
Arguments
value — Snowflake ID. Int64
time_zone — Facultatif. Fuseau horaire. La fonction interprète time_string en fonction du fuseau horaire. String
Valeur renvoyée
Renvoie le composant d’horodatage de value. DateTime64(3)
Exemples
Exemple d’utilisation
SELECT snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC');
┌─snowflakeToDateTime64(CAST('1426860802823350272', 'Int64'), 'UTC')─┐
│ 2021-08-15 10:58:19.841 │
└────────────────────────────────────────────────────────────────────┘
Introduit dans : v21.1.0
Convertit une valeur String en UUID. Si la conversion échoue, renvoie une valeur UUID par défaut au lieu de générer une erreur.
Cette fonction tente d’analyser une chaîne de 36 caractères au format UUID standard (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
Si la chaîne ne peut pas être convertie en UUID valide, la fonction renvoie la valeur UUID par défaut fournie.
Syntaxe
toUUIDOrDefault(string, default)
Arguments
string — Chaîne de 36 caractères ou FixedString(36) à convertir en UUID. - default — valeur UUID à renvoyer si le premier argument ne peut pas être converti en UUID.
Valeur renvoyée
Renvoie l’UUID converti si la conversion réussit, ou l’UUID par défaut en cas d’échec. UUID
Exemples
Une conversion réussie renvoie l’UUID obtenu
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 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘
En cas d’échec de conversion, renvoie l’UUID par défaut
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 │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Introduit dans : v20.12.0
Convertit une valeur d’entrée en valeur de type UUID, mais renvoie NULL en cas d’erreur.
Comme toUUID, mais renvoie NULL au lieu de lever une exception en cas d’erreur de conversion.
Arguments pris en charge :
- Représentations sous forme de chaîne d’UUID au format standard (8-4-4-4-12 chiffres hexadécimaux).
- Représentations sous forme de chaîne d’UUID sans traits d’union (32 chiffres hexadécimaux).
Arguments non pris en charge (renvoient NULL) :
- Formats de chaîne non valides.
- Types non chaîne.
- UUID mal formés.
Syntaxe
Arguments
x — Une représentation sous forme de chaîne d’un UUID. String
Valeur renvoyée
Renvoie une valeur UUID en cas de réussite, sinon NULL. UUID ou NULL
Exemples
Exemples d’utilisation
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 │ ᴺᵁᴸᴸ │
└──────────────────────────────────────┴──────────────┘