Standard-SQL-Datentypen

BigQuery unterstützt einfache Datentypen wie Ganzzahlen, aber auch komplexere Typen wie ARRAY und STRUCT. Diese Seite bietet eine Übersicht über die einzelnen Datentypen, einschließlich der zulässigen Werte. Informationen zu Datentyp-Literalen und Konstruktoren finden Sie unter Lexikalische Standard-SQL-Struktur.

Attribute der Datentypen

Beim Speichern und Abfragen von Daten ist es hilfreich, folgende Datentyp-Eigenschaften zu kennen:

Eigenschaft Beschreibung Gilt für
Nullable (Nullwerte zulässig) NULL ist ein gültiger Wert. Alle Datentypen mit folgenden Ausnahmen:
  • ARRAYs dürfen nicht NULL sein.
  • NULL ARRAY-Elemente können nicht in einer Tabelle beibehalten werden.
Orderable (Sortierbar) Kann in einer ORDER BY-Klausel verwendet werden. Alle Datentypen außer:
  • ARRAY
  • STRUCT
  • GEOGRAPHY
Groupable (Gruppierbar) Kann generell in einem Ausdruck auf
GROUP BY, DISTINCT oder PARTITION BY folgen.
PARTITION BY-Ausdrücke dürfen jedoch nicht die Gleitkommatypen
FLOAT und DOUBLE enthalten.
Alle Datentypen außer:
  • ARRAY
  • STRUCT
  • GEOGRAPHY
Comparable (Vergleichbar) Werte desselben Typs können miteinander verglichen werden. Alle Datentypen mit folgenden Ausnahmen: ARRAY-Vergleiche werden nicht unterstützt.

Gleichheitsvergleiche für STRUCTs werden Feld für Feld in Feldreihenfolge unterstützt. Feldnamen werden ignoriert. Weniger als und größer als Vergleiche werden nicht unterstützt.

GEOGRAPHY-Vergleiche werden nicht unterstützt. Verwenden Sie für den Vergleich von GEOGRAPHY-Werten ST_Equals.

Alle Typen, die Vergleiche unterstützen, können in einer JOIN-Bedingung verwendet werden. Eine Erläuterung der Join-Bedingungen finden Sie unter JOIN-Typen.

Numerische Typen

Numerische Typen umfassen Ganzzahltypen, Gleitkommatypen und den Datentyp NUMERIC.

Ganzzahltyp

Ganze Zahlen sind numerische Werte, die keine Bruchkomponenten haben.

Name Speichergröße Wertebereich
INT64 8 Byte -9.223.372.036.854.775.808 bis 9.223.372.036.854.775,807

Typ NUMERIC

Der Datentyp NUMERIC umfasst exakte numerische Werte mit einer maximalen Genauigkeit von 38 Ziffern und 9 Dezimalstellen. Genauigkeit gibt die Anzahl der Ziffern an, die die Nummer enthält. Mit Dezimalstellen wird angegeben, wie viele dieser Ziffern nach dem Dezimalzeichen stehen.

Mit diesem Typ können Dezimalbrüche exakt dargestellt werden. Er eignet sich für Finanzberechnungen.

Name Speichergröße Beschreibung Wertebereich
NUMERIC 16 Byte Dezimalwerte mit einer Genauigkeit von 38 Dezimalstellen und neun Dezimalstellen. -99999999999999999999999999999.999999999 bis 99999999999999999999999999999.999999999

Gleitkommatyp

Gleitkommawerte sind angenäherte numerische Werte mit Bruchkomponenten.

Name Speichergröße Beschreibung
FLOAT64 8 Byte Dezimalwerte (angenähert) mit doppelter Genauigkeit

Gleitkommasemantik

Bei der Arbeit mit Gleitkommazahlen gibt es spezielle nicht numerische Werte, die berücksichtigt werden müssen: NaN und +/-inf.

Arithmetische Operatoren bieten ein Standard-IEEE-754-Verhalten für alle endlichen Eingabewerte, die eine endliche Ausgabe erzeugen, und für alle Operationen, für die mindestens eine Eingabe nicht endlich ist.

Funktionsaufrufe und Operatoren geben einen Überlauffehler zurück, wenn die Eingabe endlich ist, aber die Ausgabe nicht endlich wäre. Wenn die Eingabe nicht endliche Werte enthält, kann die Ausgabe nicht endlich sein. Funktionen führen im Allgemeinen keine NaN- oder +/-inf-Werte ein. Spezifische Funktionen wie IEEE_DIVIDE können jedoch bei endlichen Eingaben nicht endliche Werte zurückgeben. Alle derartigen Fälle sind explizit unter Mathematische Funktionen in Standard-SQL aufgeführt.

Beispiele mathematischer Funktionen
Linker Ausdruck Operator Rechter Ausdruck Gibt zurück
Beliebiger Wert + NaN NaN
1,0 + +inf +inf
1,0 + -inf -inf
-inf + +inf NaN
Höchstwert für FLOAT64 + Höchstwert für FLOAT64 Überlauffehler
Mindest-FLOAT64-Wert / 2,0 0,0
1,0 / 0.0 Fehler "Division durch 0"

Die Vergleichsoperatoren bieten ein Standard-IEEE-754-Verhalten für die Gleitkommaeingabe.

Beispiele Vergleichsoperator
Linker Ausdruck Operator Rechter Ausdruck Gibt zurück
NaN = Beliebiger Wert FALSE
NaN < Beliebiger Wert FALSE
Beliebiger Wert < NaN FALSE
-0,0 = 0,0 TRUE
-0,0 < 0,0 FALSE

Gleitkommawerte werden in dieser Reihenfolge sortiert, vom kleinsten bis zum größten Wert:

  1. NULL
  2. NaN – Alle NaN-Werte gelten bei der Sortierung als gleich.
  3. -inf
  4. Negative Zahlen
  5. 0 oder -0 – Alle Nullwerte gelten bei der Sortierung als gleich.
  6. Positive Zahlen
  7. +inf

Spezielle Gleitkommawerte werden auf diese Weise gruppiert, einschließlich der Gruppierung, die durch eine GROUP BY-Klausel durchgeführt wird, und der Gruppierung, die nach dem DISTINCT-Keyword durchgeführt wird:

  • NULL
  • NaN – Alle NaN-Werte gelten bei der Sortierung als gleich.
  • -inf
  • 0 oder -0 – Alle Nullwerte gelten bei der Gruppierung als gleich.
  • +inf

Boolescher Typ

Name Beschreibung
BOOL Boolesche Werte werden durch die Keywords TRUE und FALSE (Groß- und Kleinschreibung) dargestellt.

String-Typ

Name Beschreibung
STRING Daten mit variabler Länge (Unicode)

Eingegebene STRING-Werte müssen und ausgegebene STRING-Werte werden jeweils UTF-8 codiert sein. Alternative Codierungen wie CESU-8 und Modified UTF-8 werden nicht als gültige UTF-8-Codierung behandelt.

Alle Funktionen und Operatoren, die auf STRING-Werte reagieren, verarbeiten Unicode-Zeichen und nicht Byte. Beispielsweise zählen Funktionen wie SUBSTR und LENGTH bei Eingabe-STRINGs die Anzahl der Zeichen, nicht Byte.

Jedem Unicode-Zeichen ist ein numerischer Wert zugewiesen, der als Codepunkt bezeichnet wird. Niedrigere Codepunkte werden niedrigeren Zeichen zugewiesen. Beim Vergleich von Zeichen bestimmen die Codepunkte, welche Zeichen kleiner oder größer als andere Zeichen sind.

Die meisten Funktionen für STRING sind auch für BYTES definiert. Bei der BYTES-Version werden jedoch Rohbyte und keine Unicode-Zeichen verarbeitet. STRING und BYTES sind getrennte Typen, die nicht austauschbar verwendet werden können. Es gibt kein implizites Umwandeln in beide Richtungen. STRING und BYTES werden durch UTF-8-Codierung und -Decodierung explizit umgewandelt. Bei der Umwandlung von BYTES in STRING wird ein Fehler zurückgegeben, wenn die Byte nicht korrekt UTF-8-codiert sind.

Byte-Typ

Name Beschreibung
BYTES Binärdaten mit variabler Länge

STRING und BYTES sind getrennte Typen, die nicht austauschbar verwendet werden können. Die meisten Funktionen für STRING sind auch für BYTES definiert. Bei der BYTES-Version werden jedoch Rohbyte und keine Unicode-Zeichen verarbeitet. Eine Umwandlung zwischen STRING und BYTES erzwingt eine Codierung der Byte mit UTF-8.

Datumstyp

Name Wertebereich
DATE 0001-01-01 bis 9999-12-31.

Der DATE-Typ repräsentiert ein logisches Kalenderdatum, unabhängig von der Zeitzone. Ein DATE-Wert repräsentiert keinen bestimmten 24-Stunden-Zeitraum. Allerdings steht ein gegebener DATE-Wert jeweils für einen anderen 24-Stunden-Zeitraum, wenn er in unterschiedlichen Zeitzonen interpretiert wird, und kann während der Übergänge zur bzw. von der Sommerzeit einen kürzeren oder längeren Tag darstellen. Verwenden Sie einen Zeitstempel, um einen absoluten Zeitpunkt darzustellen.

Kanonisches Format
'YYYY-[M]M-[D]D'
  • YYYY: vierstellige Jahreszahl
  • [M]M: ein- oder zweistellige Monatszahl
  • [D]D: ein- oder zweistellige Tageszahl

Datetime-Typ

Name Wertebereich
DATETIME 0001-01-01 00:00:00 bis 9999-12-31 23:59:59.999999.

Ein DATETIME-Objekt repräsentiert ein Datum und eine Uhrzeit, wie sie etwa auf einem Kalender oder einer Uhr angezeigt werden, unabhängig von der Zeitzone. Es enthält Jahr, Monat, Tag, Stunde, Minute, Sekunde und Sekundenbruchteil. Verwenden Sie einen Zeitstempel, um einen absoluten Zeitpunkt darzustellen.

Kanonisches Format
YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]]
  • YYYY: vierstellige Jahreszahl
  • [M]M: ein- oder zweistellige Monatszahl
  • [D]D: ein- oder zweistellige Tageszahl
  • ( |T): ein Leerzeichen oder ein "T"-Trennzeichen
  • [H]H: ein- oder zweistellige Stundenzahl (gültige Werte: 00 bis 23)
  • [M]M: ein- oder zweistellige Minutenzahl (gültige Werte: 00 bis 59)
  • [S]S: ein- oder zweistellige Sekundenzahl (gültige Werte: 00 bis 59)
  • [.DDDDDD]: bis zu sechs Nachkommastellen (auf die Mikrosekunde genau)

Time-Typ

Name Wertebereich
TIME 00:00:00 bis 23:59:59.999999.

Ein TIME-Objekt repräsentiert eine Zeit, wie sie unabhängig von einem bestimmten Datum und einer bestimmten Zeitzone etwa auf einer Armbanduhr angezeigt werden kann. Verwenden Sie einen Zeitstempel, um einen absoluten Zeitpunkt darzustellen.

Kanonisches Format
[H]H:[M]M:[S]S[.DDDDDD]
  • [H]H: ein- oder zweistellige Stundenzahl (gültige Werte: 00 bis 23)
  • [M]M: ein- oder zweistellige Minutenzahl (gültige Werte: 00 bis 59)
  • [S]S: ein- oder zweistellige Sekundenzahl (gültige Werte: 00 bis 59)
  • [.DDDDDD]: bis zu sechs Nachkommastellen (auf die Mikrosekunde genau)

Timestamp-Typ

Name Wertebereich
TIMESTAMP 0001-01-01 00:00:00 bis 9999-12-31 23:59:59.999999 UTC

Ein TIMESTAMP-Objekt repräsentiert einen absoluten Zeitpunkt unabhängig von Zeitzone oder Konvention (z. B. Sommerzeit) mit einer Genauigkeit im Mikrosekundenbereich.

  • Verwenden Sie ein DATE-Objekt, um ein Datum darzustellen, wie es auf einem Kalender vorkommen könnte.
  • Verwenden Sie ein TIME-Objekt, um eine Zeit darzustellen, wie sie auf einer Uhr angezeigt werden könnte.
  • Verwenden Sie ein DATETIME-Objekt, um ein Datum und eine Zeit darzustellen, wie sie auf einem Kalender und einer Uhr angezeigt werden könnten.
Kanonisches Format
YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]][time zone]
  • YYYY: vierstellige Jahreszahl
  • [M]M: ein- oder zweistellige Monatszahl
  • [D]D: ein- oder zweistellige Tageszahl
  • ( |T): ein Leerzeichen oder ein "T"-Trennzeichen
  • [H]H: ein- oder zweistellige Stundenzahl (gültige Werte: 00 bis 23)
  • [M]M: ein- oder zweistellige Minutenzahl (gültige Werte: 00 bis 59)
  • [S]S: ein- oder zweistellige Sekundenzahl (gültige Werte: 00 bis 59)
  • [.DDDDDD]: bis zu sechs Nachkommastellen (auf die Mikrosekunde genau)
  • [time zone]: String, der die Zeitzone darstellt. Wenn eine Zeitzone nicht explizit angegeben ist, wird die Standardzeitzone UTC verwendet. Weitere Informationen finden Sie im Abschnitt Zeitzonen.

Zeitzonen

Zeitzonen werden beim Parsen von Zeitstempeln oder zum Formatieren von Zeitstempeln für die Anzeige verwendet. Der Zeitstempelwert selbst speichert keine bestimmte Zeitzone und ändert sich auch nicht, wenn Sie einen Zeitzonenversatz anwenden.

Zeitzonen werden durch Strings in einem dieser beiden kanonischen Formate dargestellt:

  • Zeitversatz gegenüber der koordinierten Weltzeit (Coordinated Universal Time, UTC) oder der Buchstabe Z für UTC
  • Zeitzonenname aus der tz-Datenbank

Zeitversatz gegenüber koordinierter Weltzeit (UTC)

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

Beispiele

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

Bei Verwendung dieses Formats ist zwischen der Zeitzone und dem Rest des Zeitstempels kein Leerzeichen zulässig.

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

Zeitzonenname

continent/[region/]city

Zeitzonennamen stammen aus der tz-Datenbank. Eine weniger umfassende, aber einfachere Referenz finden Sie unter List of tz database time zones bei Wikipedia.

Beispiele

America/Los_Angeles
America/Argentina/Buenos_Aires

Bei Verwendung eines Zeitzonennamens ist zwischen dem Namen und dem Rest des Zeitstempels ein Leerzeichen erforderlich:

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

Beachten Sie, dass nicht alle Zeitzonennamen austauschbar sind, auch wenn sie während eines bestimmten Jahresabschnitts die gleiche Zeit wiedergeben. Zum Beispiel gibt America/Los_Angeles während der Sommerzeit die gleiche Zeit an wie UTC-7:00, aber in der Winterzeit wie UTC-8:00.

Wenn keine Zeitzone angegeben ist, wird der Standardzeitzonenwert verwendet.

Schaltsekunden

Ein Zeitstempel ist eine Verschiebung gegenüber dem Wert 1970-01-01 00:00:00 der koordinierten Weltzeit (UTC), wobei davon ausgegangen wird, dass eine Minute exakt 60 Sekunden hat. Schaltsekunden werden im gespeicherten Zeitstempel nicht berücksichtigt.

Wenn die Eingabe Werte enthält, die zur Darstellung einer Schaltsekunde ":60" im Sekundenfeld verwenden, wird diese Schaltsekunde bei der Umwandlung in einen Zeitstempelwert ignoriert. Stattdessen wird dieser Wert als Zeitstempel mit ":00" im Sekundenfeld der Folgeminute interpretiert.

Zeitstempelberechnungen werden durch Schaltsekunden nicht beeinflusst. Alle Zeitstempelberechnungen werden mit Zeitstempeln in Unix-Stil durchgeführt, die keine Schaltsekunden berücksichtigen. Schaltsekunden sind nur durch Funktionen zu beobachten, die die Zeit der Realwelt messen. Bei diesen Funktionen ist es möglich, dass eine Zeitstempelsekunde im Fall einer Schaltsekunde übersprungen oder wiederholt wird.

Array-Typ

Name Beschreibung
ARRAY Geordnete Liste von null oder mehr Elementen eines Nicht-ARRAY-Typs

Ein ARRAY ist eine geordnete Liste von null oder mehr Elementen von Nicht-ARRAY-Werten. ARRAYs von ARRAYs sind nicht zulässig. Bei Abfragen, die ein ARRAY von ARRAYs erzeugen würden, wird ein Fehler zurückgegeben. Stattdessen muss zwischen den ARRAYs ein STRUCT mit dem Konstrukt SELECT AS STRUCT eingefügt werden.

Derzeit hat BigQuery die zwei folgenden Einschränkungen in Bezug auf NULL-Werte und ARRAYs:

  • BigQuery gibt einen Fehler aus, wenn das Abfrageergebnis ARRAYs enthält, die NULL-Elemente enthalten, obwohl solche ARRAYs innerhalb der Abfrage verwendet werden können.
  • Im Abfrageergebnis übersetzt BigQuery ein NULL-ARRAY in ein leeres ARRAY, obwohl NULL und leere ARRAYs innerhalb der Abfrage zwei unterschiedliche Werte sind.

ARRAY-Typ angeben

ARRAY<T>

ARRAY-Typen werden mit spitzen Klammern (< und >) deklariert. Der Typ der Elemente eines ARRAYs kann beliebig komplex sein, mit der Ausnahme, dass ein ARRAY nicht direkt ein anderes ARRAY enthalten kann.

Beispiele

Typangabe Bedeutung
ARRAY<INT64> Einfacher ARRAY aus ganzen 64-Bit-Zahlen.
ARRAY<STRUCT<INT64, INT64>> Ein ARRAY von STRUCTs mit jeweils zwei ganzen 64-Bit-Zahlen.
ARRAY<ARRAY<INT64>>
(nicht unterstützt)
Diese Typangabe ist ungültig, wurde aber für den Fall aufgenommen, dass Sie Hinweise zum Erstellen eines mehrstufigen ARRAYS suchen. ARRAYs können nicht direkt ARRAYs enthalten. Sehen Sie sich stattdessen nachfolgendes Beispiel an.
ARRAY<STRUCT<ARRAY<INT64>>> Ein ARRAY eines ARRAYS mit ganzen 64-Bit-Zahlen. Beachten Sie, dass ein STRUCT zwischen den beiden ARRAYs vorhanden ist, da ARRAYs nicht direkt andere ARRAYs enthalten können.

Struct-Typ

Name Beschreibung
STRUCT Container der geordneten Felder jeweils mit einem Typ (erforderlich) und einem Feldnamen (optional).

STRUCT-Typ angeben

STRUCT<T>

STRUCT-Typen werden mit spitzen Klammern (< und >) deklariert. Der Typ der Elemente eines STRUCT-Ausdrucks kann beliebig komplex sein.

Beispiele

Typangabe Bedeutung
STRUCT<INT64> Einfaches STRUCT mit einem einzigen unbenannten Feld mit ganzen 64-Bit-Zahlen.
STRUCT<x STRUCT<y INT64, z INT64>> Ein STRUCT mit einem darin verschachtelten STRUCT namens x. Das STRUCT x hat zwei Felder, y und z, von denen beide ganze 64-Bit-Zahlen sind.
STRUCT<inner_array ARRAY<INT64>> Ein STRUCT enthält ein ARRAY namens inner_array, das 64-Bit-Ganzzahlelemente enthält.

STRUCT erstellen

Tupel-Syntax

(expr1, expr2 [, ... ])

Der Ausgabetyp ist ein anonymer STRUCT-Typ mit anonymen Feldern, die Typen enthalten, die den Typen der Eingabeausdrücke entsprechen. Es müssen mindestens zwei Ausdrücke angegeben sein. Andernfalls ist diese Syntax nicht von einem Ausdruck in Klammern unterscheidbar.

Beispiele

Syntax Ausgabetyp Hinweise
(x, x+y) STRUCT<?,?> Wenn Spaltennamen verwendet werden (Strings ohne Anführungszeichen), wird der STRUCT-Felddatentyp aus dem Spaltendatentyp abgeleitet. x und y sind Spalten, also werden die Datentypen der STRUCT-Felder aus den Spaltentypen und dem Ausgabetyp des Additionsoperators abgeleitet.

Diese Syntax kann auch mit dem STRUCT-Vergleich für Vergleichsausdrücke mit mehrteiligen Schlüsseln verwendet werden, z. B. in einer WHERE-Klausel:

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

Typlose Struct-Syntax

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

Doppelte Feldnamen sind zulässig. Felder ohne Namen gelten als anonym. Deshalb kann darauf nicht mit einem Namen verwiesen werden. STRUCT-Werte können NULL sein oder NULL-Feldwerte haben.

Beispiele

Syntax Ausgabetyp
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>

Typisierte Struct-Syntax

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

Typisierte Syntax ermöglicht das Erstellen von STRUCTs mit einem expliziten STRUCT-Datentyp. Der Ausgabetyp ist genau der zur Verfügung gestellte field_type. Der Eingabeausdruck wird zu field_type, wenn die beiden Typen nicht gleich sind, und es wird ein Fehler erzeugt, wenn die Typen nicht kompatibel sind. AS alias ist in den Eingabeausdrücken nicht zulässig. Die Anzahl der Ausdrücke muss mit der Anzahl der Felder im Typ übereinstimmen und die Ausdruckstypen müssen für die Feldtypen zwingend oder buchstäblich-zwingend sein.

Beispiele

Syntax Ausgabetyp
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) Fehler – Typisierte Syntax lässt AS nicht zu

Eingeschränkte Vergleiche für STRUCT

STRUCTs können direkt mit Gleichheitsoperatoren verglichen werden:

  • Gleich (=)
  • Ungleich (!= oder <>)
  • [NOT] IN

Beachten Sie aber, dass bei diesen direkten Prüfungen auf Gleichheit die Felder des STRUCT-Ausdrucks paarweise in ordinaler Reihenfolge verglichen und dabei alle Feldnamen ignoriert werden. Wenn Sie stattdessen identisch benannte Felder eines STRUCTs vergleichen möchten, können Sie die einzelnen Felder direkt vergleichen.

Geography-Typ

Name Beschreibung
GEOGRAPHY Eine Sammlung von Punkten, Linien und Polygonen, die als Punkt-Set oder als Teilmenge der Erdoberfläche dargestellt werden.

Der Typ GEOGRAPHY basiert auf der OGC-Simple-Features-Spezifikation (SFS). Er stellt eine Sammlung von Punkten, Linien oder Polygonen dar, die eine "einfache" Zusammenstellung im WGS 84-Referenzellipsoid bilden. Eine einfache Zusammenstellung ist eine Zusammenstellung, in der kein Punkt auf der WGS84-Oberfläche von mehreren Elementen der Sammlung repräsentiert wird. Sind Selbstüberschneidungen vorhanden, werden diese automatisch entfernt.

GEOGRAPHY-Werte sind das Ergebnis oder das Argument einer geografischen Funktion.