ブログ

ご注意:
この情報は過去に書かれたブログ記事のキャッシュになります。最新の情報ではありませんのでご注意ください。
また、公開当時のキャッシュされたテキストのみを読めるようにした内容になっております。 公開当時の画像やデザイン情報がありませんので、デザイン上読みにくい部分がありますことをご了承ください。 なお、最新のブログはGitHubにて公開しています。

日付0000/00/00

UUIDは,特殊なフィールド型です。アイコンは文字列型と同じであり,値も16進数32桁の文字列で表現されますが,実体は整数であり,文字列ではありません。UUIDは,通常,自動生成プロパティと併用され,複製・ジャーナリング・リレーションのキーフィールドとして間接的に使用されるので,直接,値を代入または参照することはないはずです。しかし,もし,UUIDの値を参照するのであれば,それが文字列ではないことを考慮に含めるようにしてください。この記事では,UUIDをクエリする場合の注意点を説明しています。


NULLのUUID
UUIDフィールドは,SET FIELD VALUE NULLコマンドでNULLにすることができません。しかし,すでにレコードが登録されているデータベースにUUIDフィールドを追加した場合,あるいはNULLが登録された文字列フィールドをUUIDに変更した場合,『ヌル値を空値にマップ』プロパティが設定されていなければ,既存のレコードはNULLになります。

空値にマップされていない,真のNULLであるUUIDは空の文字列のように表示されますが,空の文字列と同等に評価されるわけではありません。ですから,下記のクエリでは検出することができません。

QUERY([Table_1];[Table_1]UUID="")

そのようなUUIDを探すためには,Is field value Nullを使用する必要があります。

QUERY BY FORMULA([Table_1];Is field value Null([Table_1]UUID))

空のUUID
『ヌル値を空値にマップ』プロパティが設定されている場合,NULLであるUUIDにはゼロが代入され,その値は『0000...』という文字列で表現されます。そのような値は,下記のクエリで探すことができます。

QUERY([Table_1];[Table_1]UUID=("00"*16))

空の文字列が代入されたUUID
前述したように,NULLであるUUIDは空の文字列のように表示されますが,実際に空の文字列が代入されているわけではありません。UUIDには,32桁の16進数コードを文字列で記述して代入しますが,実際には,どんな文字列でも代入することができます。実際には,UTF-8の文字コードに変換された上で整数値が代入されるからです。足りない分の文字はスペースで埋められます。ですから,UUIDに空の文字列を代入した場合,あるいは空の文字列から変換されたUUIDフィールドの既存レコードは『2020...』という文字列で表現されます。 そのような値は,下記のクエリで探すことができます。

QUERY([Table_1];[Table_1]UUID=("20"*16))

UUIDとワイルドカード
UUIDをクエリする時には,16進数の値を文字列で渡しますが,UUIDは文字列ではないので,これにワイルドカードを使用することはできません。実際,UUIDの検索条件に記述された『@』は単なる文字として処理され,その文字コードである『40』という文字列と同じ意味になります。たとえば,下記のクエリでは『4020...』というUUIDが探されることになります。

QUERY([Table_1];[Table_1]UUID="@")

NULL以外を検索
通常,UUIDフィールドにNULLが登録されることはないはずです。UUIDがNULLになるのは,すでにNULLが登録されている文字列フィールドをUUIDに変更した場合,あるいは,UUIDフィールドが追加される前に作られたデータファイルを開いた場合などに限られます。さらに,自動生成が有効にされているUUIDフィールドは,NULLを保存しようとしたタイミングで自動的に新しい有効なUUIDが発行されます。プライマリーキーであれば,データベース開始時に新しい有効なUUIDが発行されます。『0000...』や『2020...』のような空のUUIDは,NULLではないので,そのままデータベースに残されます。UUIDは数値なので,NULL以外のUUIDは,下記のクエリで探すことができます。

QUERY([Table_1];[Table_1]UUID>=("00"*16))

まとめ
UUIDのクエリには,文字列を使用しますが,対象は整数なので,ワイルドカードを使用することはできません。ワイルドカードを含め,0-9およびA-F以外の文字は,16進数で表現された文字コードに変換されます。通常,UUIDフィールドにNULLが保存されることはありませんが,それが登録されている特殊なケースでは,通常のフィールドと同じように,QUERY BY FORMULAとIs field value Nullを併用することでNULLをクエリすることができます。空の値にマップされたUUIDは32桁の『0000...』,空の文字からマップされたUUIDは『2020...』という値になります。UUIDに空の文字列が代入されることはありません。