Standard-SQL-Datentypen

BigQuery unterstützt einfache Datentypen wie etwa Ganzzahlen, aber auch komplexere Typen wie ARRAY und STRUCT. Diese Seite bietet einen Überblick über die einzelnen Datentypen einschließlich der zulässigen Werte. Informationen zu Datentypen und Konstruktoren finden Sie unter Lexikalische Struktur und Syntax.

Datentyp-Eigenschaften

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

Eigenschaft Beschreibung Gilt für
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 der Tabelle beibehalten werden.
Sortierbar Kann in einer ORDER BY-Klausel verwendet werden. Alle Datentypen außer:
  • ARRAY
  • STRUCT
  • GEOGRAPHY
Gruppierbar Kann generell in einem Ausdruck vorkommen, der auf
GROUP BY, DISTINCT oder PARTITION BY folgt.
PARTITION BY-Ausdrücke dürfen jedoch nicht die
Gleitkommatypen FLOAT und DOUBLE enthalten.


Alle Datentypen außer:
  • ARRAY
  • STRUCT
  • GEOGRAPHY
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. Vergleiche mit "weniger als" und "größer als" werden nicht unterstützt.

ARRAY-Vergleiche werden nicht unterstützt. Für den Vergleich von GEOGRAPHY-Werten verwenden Sie ST_Equals.

Alle Typen, die Vergleiche unterstützen, können in einer JOIN-Bedingung verwendet werden. Siehe JOIN-Typen für eine Erläuterung der Join-Bedingungen.

Numerische Typen

Numerische Typen umfassen Ganzzahltypen, Gleitkommatypen und den Datentyp NUMERIC.

Ganzzahltyp

Ganze Zahlen sind numerische Werte, die keine Bruchkomponenten haben.

Name Speicherplatz Bereich
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 und er eignet sich für Finanzberechnungen.

Name Speicherplatz Beschreibung Bereich
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 Speicherplatz Beschreibung
FLOAT64 8 Byte Dezimalwerte (angenähert) mit doppelter Genauigkeit

Gleitkommasemantik

Bei der Arbeit mit Fließkommazahlen 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 ein Eingang nicht endlich ist.

Funktionsaufrufe und Operatoren melden 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 ein. Spezifische Funktionen wie IEEE_DIVIDE können jedoch nicht endliche Werte auf endliche Eingaben zurückmelden. Alle derartigen Fälle werden explizit in mathematischen Funktionen notiert.

Beispiele mathematischer Funktionen
Linker Begriff Operator Rechter Begriff Rückmeldungen
Beliebiger Wert + NaN NaN
1.0 + +inf +inf
1.0 + -inf -inf
-inf + +inf NaN
Maximaler FLOAT64-Wert + Maximaler FLOAT64-Wert Ü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 Begriff Operator Rechter Begriff Rückmeldungen
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 DISTINCT-Keyword durchgeführt wird:

  • NULL
  • NaN – Alle NaN-Werte gelten bei der Gruppierung 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 und ausgegebene STRING-Werte müssen bzw. 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. Bei der STRING-Eingabe angewendete Funktionen wie SUBSTR und LENGTH zählen beispielsweise Unicode-Zeichen, nicht Byte. Vergleiche werden in Unicode-Zeichen definiert. Weniger als und ORDER BY werden Zeichen für Zeichen verglichen und niedrigere Unicode-Code-Punkte gelten als kleinere Zeichen.

Die meisten Funktionen in STRING sind auch in BYTES definiert. Die BYTES-Version verarbeitet Rohbyte und nicht Unicode-Zeichen. STRING und BYTES sind getrennte Typen, die nicht austauschbar verwendet werden können. Es gibt kein implizites Umwandeln in beide Richtungen. STRINGS und BYTES werden durch UTF-8-Codierung und Decodierung explizit umgewandelt. Die Umwandlung von BYTES in STRING meldet einen Fehler zurück, wenn die Byte nicht gültig UTF-8-codiert sind.

Bytes-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 auf STRING sind auch auf BYTES definiert. Die BYTES-Version arbeitet auf Rohbyte und nicht auf Unicode-Zeichen. Eine Umwandlung zwischen STRING und BYTES erzwingt eine Codierung der Byte mit UTF-8.

Datumstyp

Name Beschreibung Bereich
DATE Stellt ein logisches Kalenderdatum dar. 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. Vielmehr repräsentiert ein gegebener DATE-Wert einen anderen 24-Stunden-Zeitraum, wenn in verschiedenen Zeitzonen interpretiert, und kann einen kürzeren oder längeren Tag während der Sommerzeitübergänge darstellen. Um einen absoluten Zeitpunkt darzustellen, verwenden Sie einen Zeitstempel.

Kanonisches Format

'YYYY-[M]M-[D]D'
  • YYYY: Vierstellige Jahreszahl
  • [M]M: Ein- oder zweistellige Monatszahl
  • [D]D: Ein- oder zweistellige Tageszahl

Datums-/Uhrzeittyp

Name Beschreibung Bereich
DATETIME Stellt Jahr, Monat, Tag, Stunde, Minute, Sekunde und Untersekunde dar. 0001-01-01 00:00:00 bis 9999-12-31 23:59:59.999999.

Ein DATETIME stellt einen Zeitpunkt dar. Jeder DATETIME enthält folgende Angaben:

  • Jahr
  • month (Monat)
  • day (Tag)
  • hour (Stunde)
  • minute (Minute)
  • Sekunde
  • Untersekunde

Im Gegensatz zu Zeitstempeln bezieht sich ein DATETIME-Objekt nicht auf einen absoluten Eintrag in der Zeit. Stattdessen ist es die Amtliche Zeit, oder die Zeit, die ein Nutzer auf einer Uhr oder einem Kalender sehen würde.

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 Trennzeichen T
  • [H]H: Ein- oder zweistellige Stundenzahl (gültige Werte von 00 bis 23)
  • [M]M: Ein- oder zweistellige Minutenzahl (gültige Werte von 00 bis 59)
  • [S]S: Ein- oder zweistellige Sekundenzahl (gültige Werte von 00 bis 59)
  • [.DDDDDD]: Bis zu sechs Nachkommastellen (d. h. eine Genauigkeit bis zu Mikrosekunden)

Geografischer 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, Linie oder Polygonen dar, die eine "einfache" Zusammenstellung im WGS-84-Referenz-Ellipsoid bilden. Eine einfache Zusammenstellung ist eine Zusammenstellung, in der kein Punkt auf der WGS84-Oberfläche von mehreren Elementen der Sammlung repräsentiert wird.

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

Zeittyp

Name Beschreibung Bereich
TIME Stellt eine Zeit, unabhängig von einem bestimmten Datum, dar. 00:00:00 bis 23:59:59.999999.

Ein TIME-Datentyp repräsentiert eine Zeit, unabhängig von einem bestimmten Datum.

Kanonisches Format

[H]H:[M]M:[S]S[.DDDDDD]
  • [H]H: Ein- oder zweistellige Stundenzahl (gültige Werte von 00 bis 23)
  • [M]M: Ein- oder zweistellige Minutenzahl (gültige Werte von 00 bis 59)
  • [S]S: Ein- oder zweistellige Sekundenzahl (gültige Werte von 00 bis 59)
  • [.DDDDDD]: Bis zu sechs Nachkommastellen (d. h. eine Genauigkeit bis zu Mikrosekunden)

Zeitstempeltyp

Name Beschreibung Bereich
TIMESTAMP Stellt einen absoluten, auf Mikrosekunden genauen Zeitpunkt dar. 0001-01-01 00:00:00 bis 9999-12-31 23:59:59.999999 UTC.

Ein Zeitstempel stellt einen absoluten Zeitpunkt dar, unabhängig von Zeitzone oder Umstand, z. B. Sommerzeit.

TIMESTAMP bietet eine Genauigkeit bis auf Mikrosekunden.

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 Trennzeichen T
  • [H]H: Ein- oder zweistellige Stundenzahl (gültige Werte von 00 bis 23)
  • [M]M: Ein- oder zweistellige Minutenzahl (gültige Werte von 00 bis 59)
  • [S]S: Ein- oder zweistellige Sekundenzahl (gültige Werte von 00 bis 59)
  • [.DDDDDD]: Bis zu sechs Nachkommastellen (d. h. eine Genauigkeit bis zu Mikrosekunden)
  • [time zone]: String, der die Zeitzone darstellt. Weitere Informationen finden Sie im Abschnitt Zeitzonen.

Zeitzonen werden beim Parsen von Zeitstempeln oder zum Formatieren von Zeitstempeln für die Anzeige verwendet. Der Zeitstempelwert selbst speichert keine bestimmte Zeitzone. Ein String-formatierter Zeitstempel kann eine Zeitzone enthalten. Wenn eine Zeitzone nicht explizit angegeben ist, wird die Standardzeitzone UTC verwendet.

Zeitzonen

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)

Offset-Format
(+|-)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

Zeitzonennamen stammen aus der tz-Datenbank. Eine weniger umfassende, aber einfachere Referenz finden Sie unter Liste der Zeitzonen in der tz-Datenbank auf Wikipedia.

Format
continent/[region/]city
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 einfach 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 Ihre 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.

Schaltsekunden beeinflussen keine Zeitstempelberechnungen. Alle Zeitstempelberechnungen werden mit Unix-Style-Zeitstempeln durchgeführt, die keine Schaltsekunden widerspiegeln. Schaltsekunden sind nur durch Funktionen zu beobachten, die die Echtzeit misst. 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. Abfragen, die einen ARRAY von einem ARRAYs erzeugen würden, melden einen Fehler zurück. Stattdessen muss zwischen den ARRAYs ein STRUCT mit dem Konstrukt SELECT AS STRUCT eingefügt werden.

Derzeit hat BigQuery zwei folgende Einschränkungen in Bezug auf NULLs und ARRAYs:

  • BigQuery wirft einen Fehler auf, 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 sich innerhalb der Abfrage NULL und den leeren ARRAYs zwei unterschiedliche Werte befinden.

Einen ARRAY-Typ angeben

ARRAY-Typen werden mit spitzen Klammern ( < und > ) angegeben. Die Elementtypen eines ARRAYs können beliebig komplex sein, mit der Ausnahme, dass ein ARRAY nicht direkt einen anderen ARRAY enthalten kann.

Format

ARRAY<T>

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)
Die hier enthaltene Typangabe ist ungültig, sollten Sie Anweisungen über die Erstellung 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-Typen werden mit spitzen Klammern (< und >) angegeben. Der Typ der Elemente eines STRUCT-Ausdrucks kann beliebig komplex sein.

Format

STRUCT<T>

Beispiele

Typangabe Bedeutung
STRUCT<INT64> Einfacher STRUCT mit einem einzigen unbenannten Feld mit ganzen 64-Bit-Zahlen.
STRUCT<x STRUCT<y INT64, z INT64>> Ein STRUCT mit einem enthaltenen verschachtelten STRUCT mit dem Namen x. Der 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 einen ARRAY mit dem Namen inner_array, der 64-Bit-Ganzzahlelemente enthält.

STRUCT erstellen

Tupel-Syntax

Format
(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 (nicht angeführte Strings), 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

Format
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

Format
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 beide 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 STRUCT-Ausdrucks vergleichen möchten, können Sie die einzelnen Felder direkt vergleichen.

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...