メインコンテンツまでスキップ
に最終更新

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"

規則の説明​

  1. ハイフンを 8-4-4-4-12 の位置に配置した 36 文字の標準形式、またはハイフンを含まない 32 桁の十六進数からなる短縮形式を受け付けます。
  2. 十六進数の英字には大文字(A–F)と小文字(a–f)のどちらも使用できます。どちらの入力形式からも、小文字の標準形式の UUID テキストが生成されます。
  3. 先頭または末尾の空白、波括弧、誤った長さ、位置の誤ったハイフン、十六進数以外の文字は無効です。
  4. 全ビットがゼロの UUID と全ビットが一の 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. ハイフンを 8-4-4-4-12 の位置に配置した 36 文字の標準形式、またはハイフンを含まない 32 桁の十六進数からなる短縮形式を受け付けます。
  2. 十六進数の英字には大文字(A–F)と小文字(a–f)のどちらも使用できます。どちらの入力形式からも、小文字の標準形式の UUID テキストが生成されます。
  3. 先頭または末尾の空白、波括弧、誤った長さ、位置の誤ったハイフン、十六進数以外の文字は無効です。
  4. 全ビットがゼロの UUID と全ビットが一の 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 値に変換可能なスカラー値が含まれる場合、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 に変更することはできません。移行前に、変換式を使って新しいカラムまたはテーブルに値を設定し、変換に失敗した値を確認してください。