Перейти к содержимому
Последнее обновление

Приведение к UUID

Тип UUID хранит 128-битный идентификатор, занимающий 16 байт. Его текстовое представление имеет канонический формат из 36 символов с буквами в нижнем регистре: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Для преобразования значения в UUID используйте CAST(<value> AS UUID). Строгий режим управляется параметром enable_strict_cast; см. обзор преобразования типов.

Преобразование из String​

Исходные строковые типы: CHAR, VARCHAR и STRING.

Строгий режим​

Определение BNF​

<uuid> ::= <hex8> "-" <hex4> "-" <hex4> "-" <hex4> "-" <hex12>
| <hex32>

<hex4> ::= <hexdigit> <hexdigit> <hexdigit> <hexdigit>
<hex8> ::= <hex4> <hex4>
<hex12> ::= <hex8> <hex4>
<hex32> ::= <hex8> <hex8> <hex8> <hex8>

<hexdigit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
| "a" | "b" | "c" | "d" | "e" | "f"
| "A" | "B" | "C" | "D" | "E" | "F"

Описание правил​

  1. Принимается канонический формат из 36 символов с дефисами по схеме 8-4-4-4-12 или компактный формат из 32 шестнадцатеричных цифр без дефисов.
  2. Буквы шестнадцатеричной записи могут быть в верхнем (A–F) или нижнем (a–f) регистре. Оба входных формата преобразуются в каноническое текстовое представление UUID с буквами в нижнем регистре.
  3. Пробельные символы в начале или конце, фигурные скобки, неверная длина, дефисы в неправильных позициях и нешестнадцатеричные символы недопустимы.
  4. Допустимы UUID со всеми нулевыми или всеми единичными битами. При разборе проверяется только текстовый формат, без ограничений на версию или вариант UUID.
  5. Если на входе передан NULL, возвращается NULL.
  6. Некорректный текст вызывает ошибку и прерывает выполнение запроса.

Примеры​

Входная строкаРезультат разбораКомментарий
"550e8400-e29b-41d4-a716-446655440000"УспешноСтандартный формат с дефисами
"550E8400E29B41D4A716446655440000"УспешноКомпактный формат с шестнадцатеричными буквами в верхнем регистре
"00000000-0000-0000-0000-000000000000"УспешноUUID со всеми нулевыми битами; отличается от NULL
"ffffffff-ffff-ffff-ffff-ffffffffffff"УспешноUUID со всеми единичными битами; версия и вариант не проверяются
""ОшибкаПустая строка
" 550e8400-e29b-41d4-a716-446655440000 "ОшибкаПробельные символы в начале и конце
"{550e8400-e29b-41d4-a716-446655440000}"ОшибкаФигурные скобки не допускаются
"550e8400-e29b-41d4-a716-44665544000"ОшибкаНеверная длина
"550e8400e-29b-41d4-a716-446655440000"ОшибкаДефисы в неправильных позициях
"550e8400-e29b-41d4-a716-44665544000g"ОшибкаНешестнадцатеричный символ g
NULLNULLSQL NULL остаётся NULL
SET enable_strict_cast = true;
SELECT CAST('550E8400E29B41D4A716446655440000' AS UUID) AS parsed,
CAST(CAST('550E8400E29B41D4A716446655440000' AS UUID) AS STRING) AS text_value,
CAST(NULL AS UUID) AS null_value;
+--------------------------------------+--------------------------------------+------------+
| parsed | text_value | null_value |
+--------------------------------------+--------------------------------------+------------+
| 550e8400-e29b-41d4-a716-446655440000 | 550e8400-e29b-41d4-a716-446655440000 | NULL |
+--------------------------------------+--------------------------------------+------------+

Нестрогий режим​

Определение BNF​

<uuid> ::= <hex8> "-" <hex4> "-" <hex4> "-" <hex4> "-" <hex12>
| <hex32>

<hex4> ::= <hexdigit> <hexdigit> <hexdigit> <hexdigit>
<hex8> ::= <hex4> <hex4>
<hex12> ::= <hex8> <hex4>
<hex32> ::= <hex8> <hex8> <hex8> <hex8>

<hexdigit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
| "a" | "b" | "c" | "d" | "e" | "f"
| "A" | "B" | "C" | "D" | "E" | "F"

Описание правил​

  1. Принимается канонический формат из 36 символов с дефисами по схеме 8-4-4-4-12 или компактный формат из 32 шестнадцатеричных цифр без дефисов.
  2. Буквы шестнадцатеричной записи могут быть в верхнем (A–F) или нижнем (a–f) регистре. Оба входных формата преобразуются в каноническое текстовое представление UUID с буквами в нижнем регистре.
  3. Пробельные символы в начале или конце, фигурные скобки, неверная длина, дефисы в неправильных позициях и нешестнадцатеричные символы недопустимы.
  4. Допустимы UUID со всеми нулевыми или всеми единичными битами. При разборе проверяется только текстовый формат, без ограничений на версию или вариант UUID.
  5. Если на входе передан NULL, возвращается NULL.
  6. Для некорректного текста возвращается NULL вместо возникновения ошибки.

Примеры​

Входная строкаРезультат разбораКомментарий
"550e8400-e29b-41d4-a716-446655440000"УспешноСтандартный формат с дефисами
"550E8400E29B41D4A716446655440000"УспешноКомпактный формат с шестнадцатеричными буквами в верхнем регистре
"00000000-0000-0000-0000-000000000000"УспешноUUID со всеми нулевыми битами; отличается от NULL
"ffffffff-ffff-ffff-ffff-ffffffffffff"УспешноUUID со всеми единичными битами; версия и вариант не проверяются
""NULLПустая строка
" 550e8400-e29b-41d4-a716-446655440000 "NULLПробельные символы в начале и конце
"{550e8400-e29b-41d4-a716-446655440000}"NULLФигурные скобки не допускаются
"550e8400-e29b-41d4-a716-44665544000"NULLНеверная длина
"550e8400e-29b-41d4-a716-446655440000"NULLДефисы в неправильных позициях
"550e8400-e29b-41d4-a716-44665544000g"NULLНешестнадцатеричный символ g
NULLNULLSQL NULL остаётся NULL
SET enable_strict_cast = false;
SELECT CAST('bad' AS UUID) AS invalid_cast,
TRY_CAST('{550e8400-e29b-41d4-a716-446655440000}' AS UUID) AS braces;
+--------------+--------+
| invalid_cast | braces |
+--------------+--------+
| NULL | NULL |
+--------------+--------+

Преобразование из UUID​

Приведение UUID к UUID сохраняет значение и NULL. Строгий и нестрогий режимы работают одинаково.

Преобразование из VARIANT​

Преобразование VARIANT в UUID поддерживается, если значение VARIANT содержит скалярное значение, допускающее такое преобразование. Поведение зависит от скалярного значения и настройки строгого режима.

Преобразование из других типов​

Прямое приведение скалярных значений числовых типов, типов даты и времени, IP, VARBINARY или JSON к UUID не поддерживается ни в строгом, ни в нестрогом режиме. TRY_CAST не делает неподдерживаемые преобразования допустимыми.

Преобразование с обработкой ошибок​

TRY_CAST(<string> AS UUID) возвращает NULL для некорректного текста или входного значения NULL в любом режиме. Например, некорректный текст возвращает NULL даже при включённом строгом режиме:

SET enable_strict_cast = true;
SELECT TRY_CAST('bad' AS UUID) AS invalid_try_cast;
+------------------+
| invalid_try_cast |
+------------------+
| NULL |
+------------------+

Выполнение SELECT CAST('bad' AS UUID); в этом режиме вызывает ошибку и прерывает выполнение запроса.

Используйте TO_UUID_OR_NULL, TO_UUID_OR_ZERO или TO_UUID_OR_DEFAULT, чтобы явно задать поведение при ошибке разбора независимо от enable_strict_cast. Обратите внимание: TO_UUID_OR_ZERO(NULL) возвращает NULL, а TO_UUID_OR_DEFAULT(NULL) возвращает UUID со всеми нулевыми битами.

UUID можно привести к CHAR, VARCHAR или STRING, получив каноническое текстовое представление с буквами в нижнем регистре и сохранив NULL в обоих режимах; см. Приведение к String. UUID также можно привести к VARIANT. Прямое приведение UUID к числовым типам, типам даты и времени, IP, VARBINARY или JSON не поддерживается.

При сравнении и определении общего типа строковые операнды и операнды UUID приводятся к UUID. Разбор строк выполняется по приведённым выше правилам; явные приведения помогают ясно выразить намерение.

При использовании существующего кодирования INT_TO_UUID сначала выполните преобразование в текст: CAST(INT_TO_UUID(encoded_value) AS UUID). Прямое приведение между UUID и LARGEINT не поддерживается, а функции toUInt128 нет. Для 16-байтового значения VARBINARY в каноническом порядке big-endian используйте HEX, а затем CAST(HEX(binary_value) AS UUID); произвольные 16-байтовые строки не являются каноническим текстовым представлением UUID.

Строковые элементы сложных типов можно рекурсивно приводить к UUID, например CAST(ARRAY('550e8400-e29b-41d4-a716-446655440000') AS ARRAY<UUID>). При чтении текстового представления UUID из JSON извлеките его как строку перед преобразованием; прямое приведение скалярных значений между JSON и UUID не поддерживается. Изменение схемы не позволяет напрямую изменить тип существующего строкового столбца на UUID. Заполните новый столбец или таблицу с помощью выражения преобразования и перед миграцией проверьте значения, которые не удалось преобразовать.