Google 標準 SQL のデータ型

Cloud Spanner は整数などのシンプルなデータ型と ARRAY や STRUCT などの複雑なデータ型をサポートします。このページでは許容値など各データ型の概要を記載します。

列の値の最大値は 10MiB で、スカラー型と配列型に適用されます。

利用可能なデータ型

型名 有効な列型 有効なキー列型 1 ストレージ サイズ 2
ARRAY × 要素のサイズの合計
BOOL 1 バイト
BYTES バイト数
DATE 4 バイト
FLOAT64 8 バイト
INT64 8 バイト
JSON × 正規化後の JSON 形式の文字列と同等の、UTF-8 エンコードされたバイト数。
NUMERIC 格納される値の精度とスケールの両方の関数。値 0 は 1 バイトとして保存されます。その他の値のストレージ サイズは 6 ~ 22 バイトの間で異なります。
STRING UTF-8 エンコーディングのバイト数
STRUCT × × 該当なし
タイムスタンプ 12 バイト

1 主キー、外部キー、セカンダリ インデックス。
2また、各セルには、上記の値に加えて、8 バイトのストレージ オーバーヘッドも含まれます。

データ型の特性

クエリデータを保存する場合、以下のデータ型のプロパティを覚えておくと役に立ちます。

プロパティ 説明 対象
Nullable NULL は有効な値です。 すべてのデータ型。
Orderable ORDER BY 句で使用できます。 以下を除くすべてのデータ型:
  • ARRAY
  • STRUCT
  • JSON
Groupable 通常、
GROUP BYDISTINCT
に続く式で使用できます。
以下を除くすべてのデータ型:
  • ARRAY
  • STRUCT
  • JSON
Comparable 同じ型の値をお互いに比較できます。 以下の例外を除くすべてのデータ型: ARRAY の比較はサポートされていません。

STRUCT の値の等価性比較はフィールド順にフィールドごとにサポートされています。フィールド名は無視されます。比較値よりも小さい値と大きい値はサポートされません。

JSON の比較はサポートされていません。

JOIN の条件では、比較をサポートするすべての型が使用できます。結合条件の説明については、JOIN のデータ型をご覧ください。

配列型

名前 説明
ARRAY ARRAY 型ではないゼロ以上の要素の順序付きリスト。

ARRAY は、ARRAY 型ではない値のゼロ以上の要素の順序付きリストです。ARRAY 内の要素は同じ型でなければなりません。

ARRAY からなる ARRAY は許可されません。ARRAY からなる ARRAY を生成するクエリはエラーを返します。そのような場合は、SELECT AS STRUCT コンストラクトを使用して ARRAY の間に STRUCT を挿入する必要があります。

空の ARRAY と NULL ARRAY は 2 つの異なる値です。ARRAY には NULL 要素を含めることができます。

ARRAY 型の宣言

ARRAY<T>

ARRAY 型は山括弧(<> )を使用して宣言されます。ARRAY 要素のデータ型は任意のコンプレックスにすることができますが、ARRAY に直接別の ARRAY を含めることはできません。

型の宣言 意味
ARRAY<INT64> 64 ビット整数のシンプルな ARRAY。
ARRAY<STRUCT<INT64, INT64>> STRUCT の ARRAY で、各 ARRAY には 64 ビット整数が 2 つ含まれます。
: STRUCT 値の ARRAY は SQL 式で作成できますが、列型としてはサポートされていません。
ARRAY<ARRAY<INT64>>
(サポート対象外)
これは無効な型の宣言です。マルチレベル ARRAY の作成方法を調べるためにこのページにアクセスした場合に備え、ここに記載しておきます。ARRAY には直接 ARRAY を含めることはできません。代わりに次の例をご覧ください。
ARRAY<STRUCT<ARRAY<INT64>>> 64 ビット整数の ARRAY の ARRAY。ARRAY には他の ARRAY を直接含めることができないため、2 つの ARRAY の間に STRUCT が入っていることがわかります。
: STRUCT 値の ARRAY は SQL 式で作成できますが、列型としてはサポートされていません。

ブール型

名前 説明
BOOL ブール値はキーワード TRUEFALSE(大文字と小文字の区別なし)で表されます。

ブール値は、小さい値から大きい値に並べ替えられます。

  1. NULL
  2. FALSE
  3. TRUE

バイト型

名前 説明
BYTES 可変長文字バイナリデータ。

STRING と BYTES は入れ替えて使用できない別々の型です。STRING を操作する大半の関数は BYTES に対しても定義されています。BYTES バージョンは Unicode 文字ではなく RAW バイトを操作します。STRING と BYTES の間でキャスティングを行うと、強制的に UTF-8 を使用してバイトがエンコードされます。

日付型

名前 範囲
DATE 0001-01-01~9999-12-31

DATE 型は、タイムゾーンに関係なく、論理カレンダー日を表します。DATE 型の値は特定の 24 時間の期間を表していません。所定の DATE 値は、解釈されるタイムゾーンによって異なる 24 時間の期間を表します。また、夏時間の移行期には 1 日が通常よりも短くなったり、長くなったりする場合があります。絶対的な時刻を表すには、タイムスタンプを使用します。

正規形式
'YYYY-[M]M-[D]D'
  • YYYY: 4 桁の年
  • [M]M: 1 桁または 2 桁の月
  • [D]D: 1 桁または 2 桁の日

JSON 型

名前 説明
JSON 軽量のデータ交換形式である JSON を表します。

JSON 型の値が作成される場合は、次の正規化動作が想定されます。

  • ブール値、文字列、NULL は正確に保持されます。
  • 空白文字は保持されません。
  • JSON 値は、-9,223,372,036,854,775,808(64 ビット整数の最小値)から 18,446,744,073,709,551,615(64 ビット整数の符号のない最大値)の範囲の整数と、FLOAT64 のドメイン内の浮動小数点を格納できます。
  • 配列内の要素の順序は、正確に保持されます。
  • オブジェクトのメンバーの順序は、辞書順に並べ替えられます。
  • オブジェクトに重複するキーがある場合は、最初に見つかったキーが保持されます。
  • 最大 100 レベルまでネストできます。
  • JSON 数値の元の文字列表現の形式は、保持できません。

数値型

数値型には次の種類があります。

  • INT64
  • NUMERIC
  • FLOAT64

整数型

整数は小数部分を持たない数値です。

名前 範囲
INT64 -9,223,372,036,854,775,808~9,223,372,036,854,775,807

固定小数点型

小数点型の値は、固定の小数点以下の精度とスケールを持つ数値です。精度は、数値に含まれる桁数です。スケールは小数点以下の桁数です。

この型は、小数部分を正確に表すことができ、財務計算に適しています。

名前 精度、スケール、範囲
NUMERIC 精度: 38
スケール: 9
最小: -9.9999999999999999999999999999999999999E+28
最大: 9.9999999999999999999999999999999999999E+28

浮動小数点型

浮動小数点の値は小数部分のある近似値です。

名前 説明
FLOAT64 倍精度(近似)数値。

浮動小数点セマンティクス

浮動小数点を扱う場合、NaN+/-inf という考慮しなければならない特別な非数値があります。

算術演算子は、有限出力を出すすべての有限入力値と、少なくとも 1 つの入力が非定形であるすべてのオペレーションに対し、標準 IEEE-754 動作を行えるようにします。

入力が有限値であっても出力が非定形の場合、関数呼び出しと演算子によってオーバーフロー エラーが返されます。入力に非定形値が含まれる場合、出力が非定形になる可能性があります。一般的な関数では NaN または +/-inf が使用されません。しかし、IEEE_DIVIDE のような特定の関数は有限入力に対し非定形値を返すことがあります。このような場合はすべて、数学的関数で明示的に表されます。

浮動小数点値は近似値です。

  • 浮動小数点値を表すバイナリ形式では、値の範囲で最大の正の値と最小の負の数の間の数値サブセットのみを表現できます。これにより、他の方法よりもはるかに広い範囲を効率的に処理できます。正確に表現できない数値は、近似値を使用して表します。たとえば、0.12 の累乗でスケーリングされる整数として表現することはできません。この値を文字列として表す場合は、指定した桁数に丸められます。0.1 に近い値が "0.1" と表される場合があり、正確な値でないことがわからないことがあります。それ以外の場合は、近似値が表示されます。
  • 浮動小数点値を合計すると、精度に制限があるため、予期しない結果になることがあります。たとえば、(1e30 + 1e-20) - 1e30 = 0(1e30 - 1e30) + 1e-20 = 1e-20 のようになります。これは、浮動小数点値では (1e30 + 1e-20) を表すのに十分な精度がないため、結果が 1e30 に丸められるためです。この例では、浮動小数点値の SUM 集計関数の結果が、値が累積された順序によって変わることも示しています。通常、この順序は確定的ではないため、結果も確定的ではありません。したがって、浮動小数点値の結果の SUM は確定的ではなく、同じテーブルに対して同じクエリを 2 回実行すると異なる結果になることがあります。
  • 上記の点について問題がある場合は、固定小数点型を使用してください。
数学的関数の例
左の用語 演算子 右の用語 戻り値
任意値 + NaN NaN
1.0 + +inf +inf
1.0 + -inf -inf
-inf + +inf NaN
FLOAT64 の最大値 + FLOAT64 の最大値 オーバーフロー エラー
最小 FLOAT64 / 2.0 0.0
1.0 / 0.0 「ゼロ除算」エラー

比較演算子は浮動小数点入力に対し、標準 IEEE-754 動作を行えるようにします。

比較演算子の例
左の用語 演算子 右の用語 戻り値
NaN = 任意値 FALSE
NaN < 任意値 FALSE
任意値 < NaN FALSE
-0.0 = 0.0 TRUE
-0.0 < 0.0 FALSE

浮動小数点の値は小さい値から大きい値の順に並べ替えられます。

  1. NULL
  2. NaN - 並べ替えるときにすべての NaN 値は同じものとみなされます。
  3. -inf
  4. 負の数
  5. 0 または -0 - 並べ替えるときにすべてのゼロ値は同じものとみなされます。
  6. 正の数
  7. +inf

特定の浮動小数点の値は、GROUP BY 句を使ったグループ分けと DISTINCT キーワードでのグループ分けの両方を含め、次のようにグループ分けできます。

  • NULL
  • NaN - グループ分けするときにすべての NaN 値は同じものとみなされます。
  • -inf
  • 0 または -0 - グループ分けするときにすべてのゼロ値は同じものとみなされます。
  • +inf

文字列型

名前 説明
STRING 可変長文字(Unicode)データ。

入力 STRING 値は UTF-8 エンコードに変換する必要があります。また、出力 STRING 値は UTF-8 エンコードに変換されます。CESU-8 や修正 UTF-8 などの代替エンコーディングは有効な UTF-8 として扱われません。

STRING 値を操作するすべての関数と演算子は、バイトではなく Unicode 文字を処理します。たとえば、STRING 型の入力値に適用される SUBSTRLENGTH のような関数は、バイトではなく文字数をカウントします。

各 Unicode 文字には、コードポイントと呼ばれる数値が割り当てられます。下位のコードポイントは下位の文字に割り当てられます。文字が比較されるとき、コードポイントは他の文字より小さい文字か大きい文字かを判断します。

STRING を操作する大半の関数は BYTES に対しても定義されています。BYTES バージョンは Unicode 文字ではなく RAW バイトを操作します。STRING と BYTES は入れ替えて使用できない別々の型です。いずれの方向にも暗黙的にキャスティングされません。STRING と BYTES との明示的なキャスティングでは UTF-8 エンコーディングとデコーディングが行われます。バイトが有効な UTF-8 ではない場合、BYTES から STRING へのキャスティングではエラーが返されます。

構造体型

名前 説明
STRUCT 順序付きフィールドのコンテナ。各フィールドはデータ型(必須)とフィールド名(オプション)を持ちます。

STRUCT 型の宣言

STRUCT<T>

STRUCT 型は山括弧(<>)を使用して宣言されます。STRUCT 要素のデータ型は任意のコンプレックスにすることができます。

: STRUCT 値は SQL 式で作成できますが、列型としてはサポートされていません。

型の宣言 意味
STRUCT<INT64> 単一の名前の付いていない 64 ビット整数フィールドを持つシンプルな STRUCT。
STRUCT<x STRUCT<y INT64, z INT64>> x という名前のネストされた STRUCT を内部に持つ STRUCT。この STRUCT x には yz という 2 つのフィールドがあり、その両方が 64 ビット整数です。
STRUCT<inner_array ARRAY<INT64>> 64 ビット整数要素を持つ inner_array という名前の ARRAY が含まれる STRUCT。

STRUCT の構成

タプル構文

(expr1, expr2 [, ... ])

出力データ型は、入力式のデータ型と一致する型の匿名フィールドのある匿名 STRUCT データ型です。少なくとも 2 つの指定された式が必要です。式がないと、構文は括弧で括られた式と区別できません。

構文 出力データ型
(x, x+y) STRUCT<?,?> 列名が使われている場合(文字列が引用されていない場合)、STRUCT フィールドのデータ型は列のデータ型から導出されます。xy は列であるため、STRUCT フィールドのデータ型は列の型と追加演算子の出力データ型から導出されます。

WHERE 句などのマルチパート キーを使った比較式では、この構文を使用して STRUCT を比較することもできます。

WHERE (Key1,Key2) IN ( (12,34), (56,78) )

型のない STRUCT 構文

STRUCT( expr1 [AS field_name] [, ... ])

重複するフィールド名は許可されます。名前のないフィールドは匿名フィールドとみなされ、名前では参照できません。STRUCT の値は NULLNULL フィールド値になります。

構文 出力データ型
STRUCT(1,2,3) STRUCT<int64,int64,int64>
STRUCT() STRUCT<>
STRUCT('abc') STRUCT<string>
STRUCT(1, t.str_col) STRUCT<int64, str_col string>
STRUCT(1 AS a, 'abc' AS b) STRUCT<a int64, b string>
STRUCT(str_col AS abc) STRUCT<abc string>

型のある STRUCT 構文

STRUCT<[field_name] field_type, ...>( expr1 [, ... ])

型のある構文で、明示的な STRUCT データ型を持つ STRUCT を構成できます。出力データ型は、指定された field_type と正確に同じものになります。2 つの型が同じではない場合、入力式は強制的に field_type となります。その 2 つの型に互換性がない場合はエラーとなります。AS alias は入力式で許可されません。式の数は型のフィールド数と一致しなければなりません。また、式のデータ型はフィールドのデータ型に従うように、強制的に変換できるか、リテラルを強制的に変換できる必要があります。

構文 出力データ型
STRUCT<int64>(5) STRUCT<int64>
STRUCT<date>("2011-05-05") STRUCT<date>
STRUCT<x int64, y string>(1, t.str_col) STRUCT<x int64, y string>
STRUCT<int64>(int_col) STRUCT<int64>
STRUCT<x int64>(5 AS x) エラー - 型のある構文では AS を使用できません。

STRUCT の制限付き比較

次の等価演算子を使用して、STRUCT 同士を直接比較できます。

  • 等号(=
  • 不等号(!= または <>
  • [NOT] IN

直接等価性比較では、フィールド名を無視して、元の順序で STRUCT のフィールドのペアを比較することにご注意ください。STRUCT 内で同じ名前のフィールドを比較する場合は、個々のフィールドを直接比較できます。

タイムスタンプ型

名前 範囲
TIMESTAMP 0001-01-01 00:00:00~9999-12-31 23:59:59.999999999 UTC.

TIMESTAMP オブジェクトは、タイムゾーンや夏時間などの慣習に関係なく、ナノ秒精度の絶対的な時刻を表します。

  • カレンダーに表示される日付を表すには、DATE オブジェクトを使用します。
正規形式

REST API と RPC API

TypeCode(RPC)TypeCode(REST)で説明されている JSON 値のエンコードとデコードの規則に従ってください。特に、タイムスタンプ値の末尾はズールー(Zulu)時間(UTC-0)を指定する大文字のリテラル "Z" でなければなりません。

次に例を示します。

2014-09-27T12:30:00.45Z

タイムスタンプの値はズールー時間で表現する必要があります。また、UTC オフセットを含むことはできません。たとえば、次のタイムスタンプはサポートされません。

-- NOT SUPPORTED! TIMESTAMPS CANNOT INCLUDE A UTC OFFSET WHEN USED WITH THE REST AND RPC APIS
2014-09-27 12:30:00.45-8:00

クライアント ライブラリ

言語固有のタイムスタンプ形式を使用します。

SQL クエリ

YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.F]][time zone]
  • YYYY: 4 桁の年
  • [M]M: 1 桁または 2 桁の月
  • [D]D: 1 桁または 2 桁の日
  • ( |T): スペースまたは区切り文字「T」
  • [H]H: 1 桁または 2 桁の時(有効な値は 00~23)
  • [M]M: 1 桁または 2 桁の分(有効な値は 00~59)
  • [S]S: 1 桁または 2 桁の秒(有効な値は 00~59)
  • [.F]: 小数 9 桁まで(ナノ秒の精度)
  • [time zone]: タイムゾーンを表す文字列。タイムゾーンが明示的に指定されていない場合、デフォルトのタイムゾーンである America/Los_Angeles が使用されます。詳しくは、タイムゾーンのセクションをご覧ください。

タイムゾーン

タイムゾーンは、タイムスタンプの構文を解析したり、タイムスタンプの形式を設定して表示したりするときに使用されます。タイムスタンプの値自体には、特定のタイムゾーンは格納されず、タイムゾーン オフセットを適用するときに変更されることもありません。

タイムゾーンは、次の 2 つの正規形式のいずれかで、文字列によって示されます。

  • 協定世界時(UTC)からのオフセット、または UTC を表す文字 Z
  • tz database からのタイムゾーン名

協定世界時(UTC)からのオフセット

(+|-)H[H][:M[M]]
Z

-08:00
-8:15
+3:00
+07:30
-7
Z

この形式を使用する場合、タイムゾーンと残りのタイムスタンプの間にスペースは使用できません。

2014-09-27 12:30:00.45-8:00
2014-09-27T12:30:00.45Z

タイムゾーン名

continent/[region/]city

タイムゾーン名は tz database から取得されます。あまり包括的ではありませんが簡潔な資料としては、Wikipedia の tz database のタイムゾーン一覧(英語)をご覧ください。

America/Los_Angeles
America/Argentina/Buenos_Aires

タイムゾーン名を使用する場合、名前と、残りのタイムスタンプの間にスペースが 1 つ必要です。

2014-09-27 12:30:00.45 America/Los_Angeles

タイムゾーン名によって 1 年の特定の期間に同じ時刻が偶然レポートされたとしても、すべてのタイムゾーン名が交換可能なわけではありません。たとえば、夏時間中に America/Los_AngelesUTC-7:00 と同じ時刻をレポートしたとしても、夏時間以外では同じ時刻は UTC-8:00 としてレポートされます。

タイムゾーンが指定されていない場合、デフォルトのタイムゾーンが使用されます。

うるう秒

タイムスタンプは 1970-01-01 00:00:00 UTC からの単純なオフセットであり、1 分が正確に 60 秒であることを前提にしています。保存されたタイムスタンプには、うるう秒は表示されません。

うるう秒を表すために秒フィールドで「:60」を使用する値が入力値に含まれている場合、タイムスタンプ値に変換されると、そのうるう秒は表示されなくなります。代わりに、その値は次の分の秒フィールドで「:00」を含むタイムスタンプとして解釈されます。

うるう秒はタイムスタンプの計算に影響を及ぼしません。すべてのタイムスタンプの計算は、うるう秒が反映されない Unix スタイルのタイムスタンプを使用して行われます。うるう秒は、実際の世界の時刻を測定する関数を使用する場合にのみ認識されます。このような関数では、うるう秒が発生すると、タイムスタンプの秒をスキップまたは繰り返すことができます。