Datentypen

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Auf dieser Seite erhalten Sie einen Überblick über alle Datentypen von Google Standard-SQL, einschließlich Informationen zu ihren Wertdomains. Informationen zu Datentyp-Literalen und Konstruktoren finden Sie unter Lexikalische Standard-SQL-Struktur.

Datentyp-Eigenschaften

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

Datentypen mit zulässigen Nullwerten

Für Datentypen mit zulässigen Nullwerten ist NULL ein gültiger Wert. Derzeit können alle vorhandenen Datentypen Nullwerte enthalten, aber Bedingungen gelten für ARRAYs.

Sortierbare Datentypen

Ausdrücke mit sortierbaren Datentypen können in einer ORDER BY-Klausel verwendet werden. Gilt für alle Datentypen außer:

  • ARRAY
  • STRUCT
  • GEOGRAPHY
  • JSON

Null-Werte sortieren

In Bezug auf die ORDER BY-Klausel sind NULL-Werte der kleinstmögliche Wert. NULL-Werte werden also in ASC-Sortierungen als Erstes und in DESC-Sortierungen als Letztes angezeigt.

NULL-Werte können mithilfe der Modifizierer NULLS FIRST oder NULLS LAST als erste oder letzte Werte für eine Spalte angegeben werden, unabhängig von ASC oder DESC.

Weitere Informationen zur Verwendung von ASC, DESC, NULLS FIRST und NULLS LAST finden Sie in der ORDER BY-Klausel.

Gleitkommazahlen sortieren

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

Gruppierbare Datentypen

Gruppierbare Datentypen können in einem Ausdruck nach GROUP BY, DISTINCT und PARTITION BY vorkommen. PARTITION BY-Ausdrücke dürfen jedoch keine Gleitkommatypen enthalten. Alle Datentypen werden unterstützt, außer:

  • GEOGRAPHY
  • JSON
  • ARRAY
  • STRUCT

Spezielle Gleitkommawerte werden auf die folgende 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

Vergleichbare Datentypen

Werte desselben vergleichbaren Datentyps können miteinander verglichen werden. Alle Datentypen werden unterstützt, außer:

  • GEOGRAPHY
  • JSON

Hinweise:

  • Gleichheitsvergleiche für STRUCT werden Feld für Feld in Feldreihenfolge unterstützt. Feldnamen werden dabei ignoriert. Weniger als und größer als 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.

Sortierbare Datentypen

Sortierbare Datentypen unterstützen die Sortierung, die bestimmt, wie Strings sortiert und verglichen werden. Diese Datentypen unterstützen die Sortierung:

  • STRING
  • STRING-Felder in einem STRUCT
  • STRING-Elemente in einem ARRAY

Die maximale Größe eines Spaltenwerts ist 10 MiB; sie gilt für skalare Typen und für Array-Typen.

Datentypgrößen

In der folgenden Tabelle sehen Sie die Größe in logischen Byte pro unterstütztem Datentyp.

Datentyp Größe
ARRAY Summe der Größe der zugehörigen Elemente. Beispiel: Ein Array (ARRAY<INT64>) mit vier Einträgen wird als 32 logische Byte (4 Einträge x 8 logische Byte) berechnet.
BIGNUMERIC 32 logische Byte
BOOL 1 logisches Byte
BYTES 2 logische Byte + die Anzahl logischer Byte im Wert
DATE 8 logische Byte
DATETIME 8 logische Byte
FLOAT64 8 logische Byte
GEOGRAPHY 16 logische Byte + 24 logische Byte * die Anzahl der Eckpunkte im geografischen Typ. Verwenden Sie die Funktion ST_NumPoints, um die Anzahl der Eckpunkte zu überprüfen.
INT64 8 logische Byte
INTERVAL 16 logische Byte
JSON Die Anzahl der Byte in der UTF-8-Codierung des JSON-formatierten String-Äquivalents nach der Kanonisierung.
NUMERIC 16 logische Byte
STRING 2 logische Byte + die Größe des UTF-8-codierten Strings
STRUCT 0 logische Byte + die Größe der enthaltenen Felder
TIME 8 logische Byte
TIMESTAMP 8 logische Byte

Ein NULL-Wert für einen beliebigen Datentyp wird als 0 logische Byte berechnet.

Eine wiederkehrende Spalte wird als Array gespeichert. Ihre Größe wird anhand des Datentyps der Spalte und der Anzahl der Werte berechnet. Beispiel: Eine Integer-Spalte (INT64), die wiederkehrt (ARRAY<INT64>) und 4 Einträge enthält, wird mit 32 Byte berechnet (4 Einträge × 8 logische Byte).

Parametrisierte Datentypen

Syntax:

DATA_TYPE(param[, ...])

Sie können Parameter verwenden, um Einschränkungen für die folgenden Datentypen anzugeben:

  • STRING
  • BYTES
  • NUMERIC
  • BIGNUMERIC

Ein Datentyp, der mit Parametern deklariert wird, wird als parametrisierter Datentyp bezeichnet. Sie können parametrisierte Datentypen nur mit Spalten und Skriptvariablen verwenden. Eine Spalte mit einem parametrisierten Datentyp ist eine parametrisierte Spalte und eine Skriptvariable mit einem parametrisierten Datentyp ist eine parametrisierte Skriptvariable. Parametrisierte Typbeschränkungen werden beim Schreiben eines Wertes in eine parametrisierte Spalte oder beim Zuweisen eines Wertes an eine parametrisierte Skriptvariable erzwungen.

Die Parameter eines Datentyps werden in einem Ausdruck nicht weitergegeben, sondern nur der Datentyp.

Beispiele

-- Declare a variable with type parameters.
DECLARE x STRING(10);

-- This is a valid assignment to x.
SET x = "hello";

-- This assignment to x violates the type parameter constraint and results in an OUT_OF_RANGE error.
SET x = "this string is too long"
-- Declare variables with type parameters.
DECLARE x NUMERIC(10) DEFAULT 12345;
DECLARE y NUMERIC(5, 2) DEFAULT 123.45;

-- The variable x is treated as a NUMERIC value when read, so the result of this query
-- is a NUMERIC without type parameters.
SELECT x;

-- Type parameters are not propagated within expressions, so variables x and y are treated
-- as NUMERIC values when read and the result of this query is a NUMERIC without type parameters.
SELECT x + y;

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. Alle Elemente in einem Array müssen denselben Typ haben.

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.

NULL-Elemente und der ARRAY-Typ

Derzeit gelten für BigQuery die folgenden Regeln in Bezug auf NULL- und ARRAY-Elemente:

  • Ein ARRAY kann NULL sein.

    Beispiel:

    SELECT CAST(NULL AS ARRAY<INT64>) IS NULL AS array_is_null;
    
    +---------------+
    | array_is_null |
    +---------------+
    | TRUE          |
    +---------------+
    
  • Im Abfrageergebnis übersetzt BigQuery ein NULL-ARRAY in ein leeres ARRAY, auch wenn NULL- und leere ARRAYs innerhalb der Abfrage zwei unterschiedliche Werte sind.

    Beispiel:

    WITH Items AS (
      SELECT [] AS numbers UNION ALL
      SELECT CAST(NULL AS ARRAY<INT64>))
    SELECT numbers FROM Items;
    
    +---------+
    | numbers |
    +---------+
    | []      |
    | []      |
    +---------+
    
  • BigQuery gibt einen Fehler aus, wenn das Abfrageergebnis ein ARRAY mit NULL-Elementen enthält, auch wenn ein solches ARRAY in der Abfrage verwendet werden kann.

    Folgendes funktioniert beispielsweise:

    SELECT FORMAT("%T", [1, NULL, 3]) as numbers;
    
    +--------------+
    | numbers      |
    +--------------+
    | [1, NULL, 3] |
    +--------------+
    

    Folgendes löst jedoch einen Fehler aus:

    -- error
    SELECT [1, NULL, 3] as numbers;
    

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<BYTES(5)> Einfaches ARRAY von parametrisierten Byte.
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.

ARRAY erstellen

Sie können ein ARRAY mit Arrayliteralen oder Arrayfunktionen erstellen. Weitere Informationen dazu finden Sie unter Mit Arrays arbeiten.

Boolescher Typ

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

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

  1. NULL
  2. FALSE
  3. TRUE

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.

Parametrisierter Bytetyp

Parametrisierter Typ Beschreibung
BYTES(L) Abfolge von Byte mit maximal L Byte im binären String, wobei L ein positiver INT64-Wert ist. Wenn eine Byte-Sequenz mehr als L Byte hat, wird der Fehler OUT_OF_RANGE ausgegeben.

Unter Parametrisierte Datentypen finden Sie weitere Informationen zu parametrisierten Typen und wo sie verwendet werden können.

Date-Typ

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-Wert steht für ein Datum und eine Uhrzeit, wie sie etwa auf einer Armbanduhr unabhängig von der Zeitzone angezeigt werden können. 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[.F]]
  • 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)
  • [.F]: bis zu sechs Nachkommastellen (auf die Mikrosekunde genau)

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)und umfasst folgende Objekte:

  • Punkt-Geografie: Ein einzelner Standort im Koordinatenbereich. Ein Punkt hat einen X- und eine Y-Koordinatenwert, wobei die X-Koordinate der Längen- und die Y-Koordinate der Breitengrad des Punkts auf dem WGS 84-Referenzellipsoid ist.
  • LineString-Geografie: Ein eindimensionales geometrisches Objekt mit einer Folge von Punkten und geodätischen Kanten.
  • Polygon-Geografie: Eine ebene Fläche, die durch 1 äußere Begrenzung und 0 oder mehr innere Begrenzungen definiert ist. Jede Innengrenze definiert ein Loch im Polygon. Die Begrenzungsschleifen von Polygonen sind so ausgerichtet, dass, wenn Sie die Begrenzungsscheitelpunkte der Reihe nach durchlaufen, das Innere des Polygons links liegt.

Die Punkte, Linestrings und Polygone eines GEOGRAPHY-Werts bilden eine einfache Anordnung auf dem WGS84-Referenzellipsoid. 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.

Die GEOGRAPHY, die keine Punkte, Linestrings oder Polygone enthält, wird als leere GEOGRAPHY bezeichnet.

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

Intervalltyp

Name Bereich
INTERVAL -10000-0 -3660000 -87840000:0:0 bis 10000-0 3660000 87840000:0:0

Ein INTERVAL-Objekt stellt die Dauer oder Zeitspanne dar. Das Intervall besteht aus drei unabhängigen Teilen:

  • [sign]Y-M: Jahre und Monate
  • [sign]D: Tage
  • [sign]H:M:S.F: Stunden, Minuten, Sekunden und Sekundenbruchteile.
Kanonisches Format
[sign]Y-M [sign]D [sign]H:M:S[.F]
  • Y: Jahr
  • M: Monat
  • D: Tag
  • H: Stunde
  • M: Minute
  • S: Sekunde
  • [.F]: bis zu sechs Nachkommastellen (auf die Mikrosekunde genau)

JSON-Typ

Name Beschreibung
JSON Steht für JSON, ein einfaches Datenaustauschformat.

Beim Erstellen eines Werts vom Typ JSON können Sie dieses Kanonisierungsverhalten erwarten:

  • Boolesche Werte, Strings und Nullen werden exakt beibehalten.
  • Leerzeichen werden nicht beibehalten.
  • Ein JSON-Wert kann Ganzzahlen im Bereich von -9.223.372.036.854.775.808 (niedrigste 64-Bit-Ganzzahl mit Vorzeichen) bis 18.446.744.073.709.551.615 (höchste vorzeichenlose 64-Bit-Ganzzahl) und Gleitkommazahlen innerhalb einer Domain von FLOAT64 speichern.
  • Die Reihenfolge der Elemente in einem Array bleibt genau erhalten.
  • Die Reihenfolge der Mitglieder eines Objekts wird nicht garantiert oder beibehalten.
  • Wenn ein Objekt Schlüsselduplikate hat, wird der erste gefundene Schlüssel beibehalten.
  • Es können bis zu 500 Ebenen verschachtelt werden.
  • Das Format der ursprünglichen Stringdarstellung einer JSON-Nummer wird möglicherweise nicht beibehalten.

Numerische Typen

Numerische Typen umfassen die folgenden Typen:

  • INT64 mit Alias INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT

  • NUMERIC mit Alias DECIMAL

  • BIGNUMERIC mit Alias BIGDECIMAL

  • FLOAT64

Ganzzahltyp

Ganze Zahlen sind numerische Werte, die keine Bruchkomponenten haben.

Name Wertebereich
INT64
INT
SMALLINT
INTEGER
BIGINT
TINYINT
BYTEINT
-9.223.372.036.854.775.808 bis 9.223.372.036.854.775,807

INT, SMALLINT, INTEGER, BIGINT, TINYINT und BYTEINT sind Aliasse für INT64.

Dezimaltypen

Dezimalwerte sind numerische Werte mit fester Dezimalgenauigkeit und Skalierung. Die Genauigkeit gibt die Anzahl der Ziffern an, die die Zahl 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 Genauigkeit, Skalierung und Bereich
NUMERIC
DECIMAL
Genauigkeit: 38
Skala: 9
Min.: -9,9999999999999999999999999999999999999E+28
Max.: 9,9999999999999999999999999999999999999E+28
BIGNUMERIC
BIGDECIMAL
Genauigkeit: 76,76 (die 77. Ziffer teilweise)
Skala: 38
Min.: -5,7896044618658097711785492504343953926634992332820282019728792003956564819968E+38
Max.: 5,7896044618658097711785492504343953926634992332820282019728792003956564819967E+38

DECIMAL ist ein Alias für NUMERIC. BIGDECIMAL ist ein Alias für BIGNUMERIC.

Parametrisierter Dezimaltyp

Parametrisierter Typ Beschreibung
NUMERIC(P[,S])
DECIMAL(P[,S])
Ein NUMERIC- oder DECIMAL-Typ mit einer maximalen Genauigkeit von P und einer maximalen Skalierung von S, wobei P und S INT64-Typen sind. S wird als 0 interpretiert, wenn keine Angabe gemacht wird.

Maximaler Skalierungsbereich: 0 ≤ S ≤ 9
Maximaler Genauigkeitsbereich: max(1, S) ≤ PS + 29
BIGNUMERIC(P[, S])
BIGDECIMAL(P[, S])
Ein BIGNUMERIC- oder BIGDECIMAL-Typ mit einer maximalen Genauigkeit von P und einer maximalen Skalierung von S, wobei P und S INT64-Typen sind. S wird als 0 interpretiert, wenn keine Angabe gemacht wird.

Maximaler Skalierungsbereich: 0 ≤ S ≤ 38
Maximaler Genauigkeitsbereich: max(1, S) ≤ PS + 38

Wenn ein Wert mehr als S Dezimalstellen enthält, wird der Wert auf S Dezimalstellen gerundet. Wenn Sie z. B. den Wert 1,125 in eine NUMERIC(5, 2)-Spalte einfügen, wird 1,125 zur Hälfte auf 1,13 aufgerundet.

Wenn ein Wert mehr als P Ziffern hat, wird der Fehler OUT_OF_RANGE ausgegeben. Wenn Sie z. B. 1111 in eine NUMERIC(5, 2)-Spalte einfügen, wird der Fehler OUT_OF_RANGE zurückgegeben, da 1111 größer als 999,99 ist, dem maximal zulässigen Wert in einer NUMERIC(5, 2)-Spalte.

Unter Parametrisierte Datentypen finden Sie weitere Informationen zu parametrisierten Typen und wo sie verwendet werden können.

Gleitkommatyp

Gleitkommawerte sind angenäherte numerische Werte mit Bruchkomponenten.

Name Beschreibung
FLOAT64 Numerische Werte (ungefähr) 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 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-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.

Gleitkommawerte sind Näherungswerte.

  • Das Binärformat, das zur Darstellung von Gleitkommawerten verwendet wird, kann nur eine Teilmenge der Zahlen zwischen der positivsten und der negativsten Zahl im Wertbereich darstellen. Dies ermöglicht eine effiziente Verarbeitung eines sehr viel größeren Bereichs, als es sonst möglich wäre. Zahlen, die nicht genau dargestellt werden können, werden stattdessen durch Verwendung eines Abschlusswerts angenähert. Beispielsweise kann 0.1 nicht als Ganzzahl dargestellt werden, die durch eine Potenz von 2 skaliert wird. Wenn dieser Wert als String angezeigt wird, wird er auf eine begrenzte Anzahl von Ziffern gerundet. Der Wert, der sich 0.1 nähert, wird möglicherweise als "0.1" angezeigt, wodurch die Tatsache verborgen wird, dass der Wert nicht genau ist. In anderen Fällen kann die Näherung sichtbar sein.
  • Die Addition von Gleitkommawerten kann aufgrund der begrenzten Genauigkeit zu unerwarteten Ergebnissen führen. Beispiel: (1e30 + 1e-20) - 1e30 = 0, während (1e30 - 1e30) + 1e-20 = 1e-20. Dies liegt daran, dass der Gleitkommawert nicht genügend Genauigkeit hat, um (1e30 + 1e-20) darzustellen, und das Ergebnis auf 1e30 gerundet wird. Dieses Beispiel zeigt auch, dass das Ergebnis der Aggregatfunktion SUM von Gleitkommawerten von der Reihenfolge abhängt, in der die Werte akkumuliert werden. Im Allgemeinen ist diese Reihenfolge nicht deterministisch, sodass das Ergebnis nicht deterministisch ist. Daher kann die resultierende SUM von Gleitkommawerten evtl. nicht deterministisch sein und zwei Ausführungen der gleichen Abfrage in denselben Tabellen können zu unterschiedlichen Ergebnissen führen.
  • Wenn die obigen Punkte betroffen sind, verwenden Sie stattdessen einen Dezimaltyp.
Beispiele für mathematische 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

Weitere Informationen dazu, wie diese Werte sortiert und gruppiert werden, damit sie verglichen werden können, finden Sie unter Gleitkommawerte sortieren.

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.

Parametrisierter Stringtyp

Parametrisierter Typ Beschreibung
STRING(L) String mit maximal L erlaubten Unicode-Zeichen im String, wobei L ein positiver INT64-Wert ist. Wenn ein String mit mehr als L Unicode-Zeichen zugewiesen wird, wird der Fehler OUT_OF_RANGE ausgegeben.

Unter Parametrisierte Datentypen finden Sie weitere Informationen zu parametrisierten Typen und wo sie verwendet werden 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 STRING(10)> Einfaches STRUCT mit einem einzelnen parametrisierten Stringfeld namens „x“.
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.

Time-Typ

Name Bereich
TIME 00:00:00 bis 23:59:59.999999

Ein TIME-Wert steht für eine Tageszeit, wie sie unabhängig von einem bestimmten Datum und einer bestimmten Zeitzone etwa auf einer Uhr angezeigt werden kann. Verwenden Sie einen Zeitstempel, um einen absoluten Zeitpunkt darzustellen.

Kanonisches Format
[H]H:[M]M:[S]S[.DDDDDD|.F]
  • [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)
  • [.F]: 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-Wert steht für einen absoluten Zeitpunkt unabhängig von Zeitzone oder Konvention (z. B. Sommerzeit) mit einer Genauigkeit im Mikrosekundenbereich.

Ein TIMESTAMP wird normalerweise intern als die Anzahl der verstrichenen Mikrosekunden seit einem festen anfänglichen Zeitpunkt dargestellt.

Beachten Sie, dass TIMESTAMP selbst keine Zeitzone hat. Es stellt die gleiche Zeit global dar. Die Anzeige eines Zeitstempels enthält jedoch in der Regel ein Datum, eine Uhrzeit und eine Zeitzone in einem implementierungsabhängigen Format, damit sie besser lesbar ist. Beispiel: Die angezeigten Werte „2020-01-01 00:00:00 UTC“, „2019-12-31 19:00:00 America/New_York“ und „2020-01-01 05:30:00 Asia/Kolkata“ stellen alle denselben Zeitpunkt und daher denselben TIMESTAMP-Wert dar.

  • Verwenden Sie einen DATE-Wert, um ein Datum darzustellen, wie es auf einem Kalender (ein amtliches Datum) vorkommen könnte.
  • Verwenden Sie einen TIME-Wert, um eine Zeit darzustellen, wie sie auf einer Uhr (einer amtlichen Zeit) angezeigt werden könnte.
  • Verwenden Sie einen DATETIME-Wert, um ein Datum und eine Zeit darzustellen, wie sie auf einer Armbanduhr angezeigt werden könnten.
Kanonisches Format für TIMESTAMP-Literale

Das kanonische Format für ein TIMESTAMP-Literal besteht aus folgenden Teilen:

{
  civil_date_time [time_zone] |
  civil_date_time[time_zone_offset] |
  civil_date_time[utc_time_zone]
}

civil_date_time:
    YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.F]]
  • 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)
  • [.F]: 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 unter Zeitzonen.
  • [time_zone_offset]: String, der den Zeitversatz gegenüber der Zeitzone der koordinierten Weltzeit (UTC) darstellt. Weitere Informationen finden Sie unter Zeitzonen.
  • [utc_time_zone]: String, der die koordinierte Weltzeit (UTC) darstellt, normalerweise der Buchstabe Z. Weitere Informationen finden Sie unter Zeitzonen.

Zeitzonen

Eine Zeitzone wird verwendet, wenn ein Datum oder eine Uhrzeit (wie auf einem Kalender oder einer Uhr angezeigt) in einen Zeitstempel (eine absolute Zeit) konvertiert werden kann oder umgekehrt. Dies umfasst den Vorgang, bei dem ein String mit einem zivilen Datum und einer Uhrzeit wie „2020-01-01 00:00:00“ geparst und in einen Zeitstempel konvertiert wird. Der resultierende Zeitstempelwert selbst speichert keine bestimmte Zeitzone, da er global eine Zeit darstellt.

Zeitzonen werden durch Strings in einem der folgenden 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

Die folgenden Zeitstempel sind identisch, da der Zeitzonenversatz für America/Los_Angeles den Wert -08 für das angegebene Datum und die angegebene Uhrzeit hat.

SELECT UNIX_MILLIS(TIMESTAMP '2008-12-25 15:30:00 America/Los_Angeles') AS millis;
SELECT UNIX_MILLIS(TIMESTAMP '2008-12-25 15:30:00-08:00') AS millis;

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.