Приведение к 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"
Описание правил
- Принимается канонический формат из 36 символов с дефисами по схеме
8-4-4-4-12или компактный формат из 32 шестнадцатеричных цифр без дефисов. - Буквы шестнадцатеричной записи могут быть в верхнем (
A–F) или нижнем (a–f) регистре. Оба входных формата преобразуются в каноническое текстовое представление UUID с буквами в нижнем регистре. - Пробельные символы в начале или конце, фигурные скобки, неверная длина, дефисы в неправильных позициях и нешестнадцатеричные символы недопустимы.
- Допустимы UUID со всеми нулевыми или всеми единичными битами. При разборе проверяется только текстовый формат, без ограничений на версию или вариант UUID.
- Если на входе передан
NULL, возвращаетсяNULL. - Некорректный текст вызывает ошибку и прерывает выполнение запроса.
Примеры
| Входная строка | Результат разбора | Комментарий |
|---|---|---|
"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 |
NULL | NULL | SQL 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"
Описание правил
- Принимается канонический формат из 36 символов с дефисами по схеме
8-4-4-4-12или компактный формат из 32 шестнадцатеричных цифр без дефисов. - Буквы шестнадцатеричной записи могут быть в верхнем (
A–F) или нижнем (a–f) регистре. Оба входных формата преобразуются в каноническое текстовое представление UUID с буквами в нижнем регистре. - Пробельные символы в начале или конце, фигурные скобки, неверная длина, дефисы в неправильных позициях и нешестнадцатеричные символы недопустимы.
- Допустимы UUID со всеми нулевыми или всеми единичными битами. При разборе проверяется только текстовый формат, без ограничений на версию или вариант UUID.
- Если на входе передан
NULL, возвращаетсяNULL. - Для некорректного текста возвращается
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 |
NULL | NULL | SQL 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. Заполните новый столбец или таблицу с помощью выражения преобразования и перед миграцией проверьте значения, которые не удалось преобразовать.