UUID へのキャスト
UUID 型は、128 ビットの識別子を 16 バイトで格納します。テキスト表現は、xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx という 36 文字の小文字の標準形式です。
値を UUID に変換するには CAST(<value> AS UUID) を使用します。厳密モードは enable_strict_cast で制御します。詳しくは型変換の概要を参照してください。
文字列からの変換
変換元の文字列型には 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"
規則の説明
- ハイフンを
8-4-4-4-12の位置に配置した 36 文字の標準形式、またはハイフンを含まない 32 桁の十六進数からなる短縮形式を受け付けます。 - 十六進数の英字には大文字(
A–F)と小文字(a–f)のどちらも使用できます。どちらの入力形式からも、小文字の標準形式の UUID テキストが生成されます。 - 先頭または末尾の空白、波括弧、誤った長さ、位置の誤ったハイフン、十六進数以外の文字は無効です。
- 全ビットがゼロの 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"
規則の説明
- ハイフンを
8-4-4-4-12の位置に配置した 36 文字の標準形式、またはハイフンを含まない 32 桁の十六進数からなる短縮形式を受け付けます。 - 十六進数の英字には大文字(
A–F)と小文字(a–f)のどちらも使用できます。どちらの入力形式からも、小文字の標準形式の UUID テキストが生成されます。 - 先頭または末尾の空白、波括弧、誤った長さ、位置の誤ったハイフン、十六進数以外の文字は無効です。
- 全ビットがゼロの 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 値に変換可能なスカラー値が含まれる場合、VARIANT から UUID への変換がサポートされます。変換時の動作は、スカラー値と厳密モードの設定によって異なります。
その他の型からの変換
数値、日付・時刻、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 は保持されます。詳しくは文字列へのキャストを参照してください。UUID は VARIANT にもキャストできます。UUID から数値、日付・時刻、IP、VARBINARY、JSON 型への直接のキャストはサポートされません。
文字列と UUID を比較する場合や共通の型を推論する場合、両オペランドは UUID に型変換されます。文字列の解析には前述の規則が適用されます。明示的にキャストすると意図が明確になります。
既存の INT_TO_UUID エンコーディングを扱う場合は、まずテキストに変換します:CAST(INT_TO_UUID(encoded_value) AS UUID)。UUID と LARGEINT の間の直接のキャストはサポートされず、toUInt128 関数もありません。標準的なビッグエンディアン順の 16 バイトの VARBINARY には、HEX を使ってから CAST(HEX(binary_value) AS UUID) を実行します。任意の 16 バイト文字列が標準形式の UUID テキストであるわけではありません。
複合型の文字列要素は再帰的に UUID にキャストできます。たとえば CAST(ARRAY('550e8400-e29b-41d4-a716-446655440000') AS ARRAY<UUID>) です。JSON から UUID テキストを読み取る場合は、変換前に文字列として抽出します。JSON と UUID の間の直接のスカラーキャストはサポートされません。スキーマ変更によって既存の文字列カラムを直接 UUID に変更することはできません。移行前に、変換式を使って新しいカラムまたはテーブルに値を設定し、変換に失敗した値を確認してください。