BigQuery accepte les types de données simples tels que les nombres entiers, ainsi que les types plus complexes tels que ARRAY et STRUCT. Cette page fournit un aperçu de chaque type de données et des valeurs autorisées. Pour en savoir plus sur les littéraux et les constructeurs de types de données, consultez la page Structure lexicale et syntaxe.
Propriétés de type de données
Lors du stockage et de l'interrogation des données, il est utile de garder à l'esprit les propriétés de type de données suivantes :
Propriété | Description | Applicable à |
---|---|---|
Nullable | NULL est une valeur valide. |
Tous les types de données, avec les exceptions suivantes :
|
Orderable | Peut être utilisé dans une clause ORDER BY . |
Tous les types de données sauf :
|
Groupable | Peut généralement apparaître dans une expression aprèsGROUP BY , DISTINCT et PARTITION BY .Cependant, les expressions PARTITION BY ne peuvent pas inclureles types à virgule flottante. |
Tous les types de données sauf :
|
Comparable | Les valeurs du même type peuvent être comparées les unes aux autres. | Tous les types de données, avec les exceptions suivantes :
Les comparaisons ARRAY ne sont pas acceptées.
Les comparaisons d'égalité pour les données STRUCT sont acceptées, champ par champ, selon l'ordre des champs. Les noms de champ sont ignorés. Les comparaisons "inférieur à" et "supérieur à" ne sont pas acceptées. Les comparaisons GEOGRAPHY ne sont pas acceptées. Pour comparer des valeurs GEOGRAPHY, utilisez ST_Equals. Tous les types acceptant les comparaisons peuvent être utilisés dans une condition JOIN . Pour plus de précisions sur les conditions de jointure, consultez la section Types JOIN. |
Type Array
Nom | Description |
---|---|
ARRAY |
Liste numérotée comportant zéro ou plusieurs éléments de type autre que ARRAY. |
Un tableau est une liste numérotée comportant zéro ou plusieurs éléments dont la valeur est d'un type autre que ARRAY.
Les tableaux imbriqués (ARRAY lui-même composé d'éléments ARRAY) ne sont pas autorisés. Les requêtes qui produisent de tels tableaux imbriqués vont afficher une erreur. Il convient, à la place, d'insérer un objet STRUCT entre les tableaux à l'aide de la construction SELECT AS STRUCT
.
Actuellement, BigQuery comporte deux limites concernant les valeurs NULL
et ARRAY :
- BigQuery génère une erreur si le résultat de la requête comprend des ARRAY contenant des éléments
NULL
, bien que de tels ARRAY puissent être utilisés dans la requête. - BigQuery traduit les valeurs ARRAY
NULL
en ARRAY vides dans le résultat de la requête, bien que les valeursNULL
et ARRAY vides représentent deux valeurs distinctes dans la requête.
Déclarer un type ARRAY
ARRAY<T>
Les types ARRAY sont déclarés à l'aide des chevrons (<
et >
). Le type des éléments d'un ARRAY peut être arbitrairement complexe, à l'exception du fait qu'un tableau ne peut pas contenir directement un autre tableau.
Exemples
Déclaration de type | Signification |
---|---|
ARRAY<INT64>
|
Tableau simple de nombres entiers de 64 bits. |
ARRAY<STRUCT<INT64, INT64>>
|
Tableau de structures contenant chacune deux entiers de 64 bits. |
ARRAY<ARRAY<INT64>>
(non compatible) |
Cette déclaration de type non valide n'est mentionnée ici que pour le cas où vous chercheriez comment créer un tableau multidimensionnel. Les tableaux ne peuvent pas contenir d'autres tableaux directement. Reportez-vous plutôt à l'exemple suivant. |
ARRAY<STRUCT<ARRAY<INT64>>>
|
Tableau de tableaux de nombres entiers de 64 bits. Sachez qu'il y a un objet STRUCT entre les deux tableaux, car ceux-ci ne peuvent pas contenir d'autres tableaux directement. |
Type Boolean
Nom | Description |
---|---|
BOOL |
Les valeurs booléennes sont représentées par les mots clés TRUE et FALSE (non sensibles à la casse). |
Les valeurs booléennes sont triées dans l'ordre suivant, de la plus petite à la plus grande :
NULL
FALSE
TRUE
Type Bytes
Nom | Description |
---|---|
BYTES |
Données binaires de longueur variable. |
STRING et BYTES sont des types distincts qui ne peuvent pas être utilisés de manière interchangeable. La plupart des fonctions de STRING sont également définies sur BYTES. La version de BYTES fonctionne sur des octets bruts plutôt que sur des caractères Unicode. Les conversions entre STRING et BYTES forcent l'encodage des octets au format UTF-8.
Type Date (date)
Nom | Plage |
---|---|
DATE |
De 0001-01-01 à 9999-12-31 |
Le type DATE représente une date de calendrier logique, indépendante du fuseau horaire. Une valeur DATE ne représente pas une période de 24 heures particulière. Elle représente plutôt une période de 24 heures différente selon le fuseau horaire dans lequel elle est interprétée. De plus, elle peut représenter un jour plus court ou plus long lors des passages à l'heure d'été. Pour représenter un moment précis, il convient d'utiliser un horodatage.
Format canonique
'YYYY-[M]M-[D]D'
YYYY
: année à quatre chiffres[M]M
: mois à un ou deux chiffres[D]D
: jour à un ou deux chiffres
Type Datetime (date/heure)
Nom | Plage |
---|---|
DATETIME |
De 0001-01-01 00:00:00 à 9999-12-31 23:59:59.999999. |
Un objet DATETIME représente une date et une heure telles qu'affichées sur un calendrier ou une horloge, indépendamment du fuseau horaire. Il comprend l'année, le mois, le jour, l'heure, la minute, la seconde et la milliseconde. Pour représenter un moment précis, il convient d'utiliser un horodatage.
Format canonique
YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]]
YYYY
: année à quatre chiffres[M]M
: mois à un ou deux chiffres[D]D
: jour à un ou deux chiffres( |T)
: espace ou séparateur "T"[H]H
: heure à un ou deux chiffres (valeurs valides de 00 à 23)[M]M
: minutes à un ou deux chiffres (valeurs valides comprises entre 00 et 59)[S]S
: secondes à un ou deux chiffres (valeurs valides comprises entre 00 et 59)[.DDDDDD]
: jusqu'à six chiffres fractionnaires (précision de l'ordre de la microseconde)
Type Geography (géographie)
Nom | Description |
---|---|
GEOGRAPHY |
Ensemble de points, de lignes et de polygones, représenté sous la forme d'un jeu de points, ou un sous-ensemble de la surface de la Terre. |
Basé sur la spécification SFS (OGC Simple Features), le type GEOGRAPHY
consiste en un ensemble de points, de lignes ou de polygones formant un agencement "simple" sur l'ellipsoïde de référence WGS84.
Dans un agencement simple, aucun point de la surface WGS84 n'est contenu par plusieurs éléments de la collection. Si des auto-intersections existent, elles sont automatiquement supprimées.
Un objet de type GEOGRAPHY
représente le résultat ou un argument d'une fonction de géographie.
Types numériques
Les types numériques incluent les types suivants :
INT64
NUMERIC
avec l'aliasDECIMAL
BIGNUMERIC
avec l'aliasBIGDECIMAL
(Aperçu)FLOAT64
Type entier
Les entiers sont des valeurs numériques qui ne possèdent pas de composants fractionnaires.
Nom | Plage |
---|---|
INT64 |
De -9,223,372,036,854,775,808 à 9,223,372,036,854,775,807 |
Types décimaux
Les valeurs de type décimal sont des valeurs numériques ayant une précision et une échelle fixes. la précision correspond au nombre de chiffres contenus par le nombre ; L'échelle représente le nombre de chiffres après la virgule.
Ce type peut représenter les fractions décimales avec exactitude et convient aux calculs financiers.
Nom | Précision, évolutivité et plage |
---|---|
NUMERIC
DECIMAL |
Precision : 38 Échelle : 9 Min : -9.9999999999999999999999999999999999999E+29 Max : 9.9999999999999999999999999999999999999E+29 |
BIGNUMERIC
BIGDECIMAL (Bêta) |
Précision : 76,76 (le 77e chiffre est partiel) Échelle : 38 Min : -5,789260461865809771178541920430434395392663499233282028201972879200390656419968E+38 Max : 5,78960461865809771179851920430435392663499233282028201972879200390656419967E+38 |
DECIMAL
est un alias pour NUMERIC
.
BIGDECIMAL
est un alias pour BIGNUMERIC
.
Type Floating point
Les valeurs à virgule flottante sont des valeurs numériques approximatives qui possèdent des composants fractionnaires.
Nom | Description |
---|---|
FLOAT64 |
Valeurs numériques à double précision (approximatives). |
Sémantique à virgule flottante
Lorsque vous travaillez avec des nombres à virgule flottante, vous devez tenir compte des valeurs spéciales non numériques telles que : NaN
et +/-inf
.
Les opérateurs arithmétiques assurent un comportement conforme à la norme IEEE-754 pour toutes les valeurs d'entrée finies produisant des sorties finies et pour toutes les opérations pour lesquelles au moins une entrée est non finie.
Les appels de fonction et les opérateurs renvoient une erreur de dépassement de capacité si l'entrée est finie mais que la sortie est non finie. Si l'entrée contient des valeurs non finies, la sortie peut être non finie. En général, les fonctions n'introduisent pas de valeurs NaN
ou +/-inf
. Cependant, des fonctions spécifiques telles que IEEE_DIVIDE
peuvent afficher des valeurs non finies pour une entrée finie. Tous ces cas sont décrits dans la section consacrée aux fonctions mathématiques.
Exemples de fonctions mathématiques
Terme gauche | Opérateur | Terme droit | Affiche |
---|---|---|---|
Valeur quelconque | + |
NaN |
NaN |
1,0 | + |
+inf |
+inf |
1,0 | + |
-inf |
-inf |
-inf |
+ |
+inf |
NaN |
Valeur FLOAT64 maximale |
+ |
Valeur FLOAT64 maximale |
Erreur de dépassement de capacité |
Valeur FLOAT64 minimale |
/ |
2.0 | 0,0 |
1,0 | / |
0.0 |
Erreur "Diviser par zéro" |
Les opérateurs de comparaison assurent un comportement conforme à la norme IEEE-754 pour les entrées à virgule flottante.
Exemples d'opérateurs de comparaison
Terme gauche | Opérateur | Terme droit | Affiche |
---|---|---|---|
NaN |
= |
Valeur quelconque | FALSE |
NaN |
< |
Valeur quelconque | FALSE |
Valeur quelconque | < |
NaN |
FALSE |
-0,0 | = |
0,0 | TRUE |
-0,0 | < |
0,0 | FALSE |
Les valeurs à virgule flottante sont triées dans l'ordre suivant, de la plus petite à la plus grande :
NULL
NaN
: toutes les valeursNaN
sont considérées comme équivalentes lors du tri.-inf
- Nombres négatifs
- 0 ou -0 - Toutes les valeurs zéro sont considérées comme égales lors du tri.
- Nombres positifs
+inf
Les valeurs spéciales à virgule flottante sont regroupées de cette façon, par une clause GROUP BY
et par le mot clé DISTINCT
:
NULL
NaN
: toutes les valeursNaN
sont considérées comme équivalentes lors du tri.-inf
- 0 ou -0 - Toutes les valeurs zéro sont considérées comme égales lors du regroupement.
+inf
Type String
Nom | Description |
---|---|
STRING |
Données constituées de caractères de longueur variable (Unicode) |
Les valeurs d'entrée STRING doivent être encodées au format UTF-8 pour que les valeurs de sortie STRING soient encodées avec ce format. Les encodages alternatifs tels que CESU-8 et UTF-8 modifié ne sont pas traités comme des encodages UTF-8 valides.
Toutes les fonctions et tous les opérateurs qui agissent sur les valeurs STRING opèrent sur des caractères Unicode plutôt que sur des octets. Par exemple, des fonctions telles que SUBSTR
et LENGTH
appliquées à une entrée STRING comptent le nombre de caractères, et non d'octets.
Chaque caractère Unicode est associé à une valeur numérique appelée point de code. Les points de code inférieurs sont associés aux caractères inférieurs. Lorsque des caractères sont comparés, les points de code déterminent ceux qui sont inférieurs ou supérieurs aux autres caractères.
La plupart des fonctions de STRING sont également définies sur BYTES. La version de BYTES fonctionne sur des octets bruts plutôt que sur des caractères Unicode. STRING et BYTES sont des types distincts qui ne peuvent pas être utilisés de manière interchangeable. Il n'y a pas de conversion implicite dans les deux sens. La conversion forcée explicite entre STRING et BYTES s'effectue par le biais d'un encodage/décodage UTF-8. La conversion forcée de valeurs BYTES en valeurs STRING affiche une erreur si les octets ne sont pas des encodages UTF-8 valides.
Type Struct
Nom | Description |
---|---|
STRUCT |
Conteneur de champs numérotés ayant chacun un type (obligatoire) et un nom de champ (facultatif) |
Déclarer un type de structure
STRUCT<T>
Les types de structure sont déclarés à l'aide des chevrons (<
et >
). Le type des éléments d'un objet STRUCT peut être arbitrairement complexe.
Exemples
Déclaration de type | Signification |
---|---|
STRUCT<INT64>
|
Structure simple avec un seul champ d'entier de 64 bits sans nom |
STRUCT<x STRUCT<y INT64, z INT64>>
|
Structure comprenant une structure imbriquée nommée x . L'objet STRUCT x contient deux champs : y et z , qui sont tous deux des entiers de 64 bits. |
STRUCT<inner_array ARRAY<INT64>>
|
Structure comprenant un tableau nommé inner_array , contenant des entiers de 64 bits. |
Construire une structure
Syntaxe de tuple
(expr1, expr2 [, ... ])
Le type de sortie est un type STRUCT anonyme comportant des champs anonymes dont les types correspondent à ceux des expressions d'entrée. Vous devez spécifier au moins deux expressions, sinon cette syntaxe ne peut pas être distinguée d'une expression entre parenthèses.
Exemples
Syntaxe | Type de sortie | Notes |
---|---|---|
(x, x+y) |
STRUCT<?,?> |
Si vous utilisez des noms de colonne (chaînes sans guillemets), le type de données du champ STRUCT est dérivé de celui de la colonne. Étant donné que x et y sont des colonnes, les types de données des champs STRUCT sont dérivés du type des colonnes et du type de sortie de l'opérateur d'addition. |
Cette syntaxe peut également être utilisée avec les expressions de comparaison de structures basées sur des clés composées de plusieurs parties, par exemple dans une clause WHERE
:
WHERE (Key1,Key2) IN ( (12,34), (56,78) )
Syntaxe de structure sans type
STRUCT( expr1 [AS field_name] [, ... ])
Les noms de champs en double sont autorisés. Les champs sans nom sont considérés comme des champs anonymes et ne peuvent donc pas être référencés par nom. Les valeurs de type STRUCT peuvent être NULL
ou avoir des valeurs de champ NULL
.
Exemples
Syntaxe | Type de sortie |
---|---|
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> |
Syntaxe de structure avec type
STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
La syntaxe avec type permet de construire des structures avec un type de données STRUCT explicite. Le type de sortie est exactement le champ field_type
qui est spécifié. Le type de l'expression d'entrée est field_type
si les deux types ne sont pas identiques, et une erreur est générée si les types ne sont pas compatibles. AS alias
n'est pas autorisé sur les expressions d'entrée. Le nombre d'expressions doit correspondre au nombre de champs du type, et le type des expressions doit être convertible de manière forcée ou en littéral en fonction des types de champ.
Exemples
Syntaxe | Type de sortie |
---|---|
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) |
Erreur - La syntaxe avec type n'autorise pas AS . |
Comparaisons limitées de structures
Les structures peuvent être directement comparées en utilisant des opérateurs d'égalité :
- Égal à (
=
) - Différent de (
!=
ou<>
) - [
NOT
]IN
Sachez cependant que ces comparaisons directes d'égalité comparent les champs de structure par paire, dans l'ordre ordinal, en ignorant les noms de champ. Si, à la place, vous souhaitez comparer des champs d'une structure portant le même nom, vous pouvez comparer les champs individuels directement.
Type Time (heure)
Nom | Plage |
---|---|
TIME |
De 00:00:00 à 23:59:59.99999. |
Un objet TIME représente une heure telle qu'affichée sur une montre, indépendamment d'une date et d'un fuseau horaire spécifiques. Pour représenter un moment précis, il convient d'utiliser un horodatage.
Format canonique
[H]H:[M]M:[S]S[.DDDDDD]
[H]H
: heure à un ou deux chiffres (valeurs valides de 00 à 23)[M]M
: minutes à un ou deux chiffres (valeurs valides comprises entre 00 et 59)[S]S
: secondes à un ou deux chiffres (valeurs valides comprises entre 00 et 59)[.DDDDDD]
: jusqu'à six chiffres fractionnaires (précision de l'ordre de la microseconde)
Type Timestamp
Nom | Plage |
---|---|
TIMESTAMP |
De 0001-01-01 00:00:00 à 9999-12-31 23:59:59.999999 UTC |
Un objet TIMESTAMP représente un moment précis, indépendant de tout fuseau horaire ou convention, telle que l'heure d'été, avec une précision de l'ordre de la microseconde.
- Pour représenter une date telle qu'elle peut apparaître sur un calendrier, utilisez un objet DATE.
- Pour représenter une heure telle qu'elle peut apparaître sur une horloge, utilisez un objet TIME.
- Pour représenter une date et une heure telles qu'elles peuvent apparaître sur un calendrier et une horloge, utilisez un objet DATETIME.
Format canonique
YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]][time zone]
YYYY
: année à quatre chiffres[M]M
: mois à un ou deux chiffres[D]D
: jour à un ou deux chiffres( |T)
: espace ou séparateur "T"[H]H
: heure à un ou deux chiffres (valeurs valides de 00 à 23)[M]M
: minutes à un ou deux chiffres (valeurs valides comprises entre 00 et 59)[S]S
: secondes à un ou deux chiffres (valeurs valides comprises entre 00 et 59)[.DDDDDD]
: jusqu'à six chiffres fractionnaires (précision de l'ordre de la microseconde)[time zone]
: chaîne représentant le fuseau horaire. Lorsqu'un fuseau horaire n'est pas spécifié explicitement, le fuseau horaire par défaut est utilisé (UTC). Pour plus de précisions, consultez la section Fuseaux horaires.
Fuseaux horaires
Les fuseaux horaires sont utilisés lors de l'analyse ou du formatage des horodatages à des fins d'affichage. La valeur d'horodatage elle-même ne stocke pas de fuseau horaire spécifique et ne change pas lorsque vous appliquez un décalage de fuseau horaire.
Les fuseaux horaires sont représentés par des chaînes dans l'un de ces deux formats canoniques :
- Décalage par rapport au temps universel coordonné (UTC), ou bien la lettre
Z
pour l'UTC - Nom du fuseau horaire issu de la base de données tz
Décalage par rapport au temps universel coordonné (UTC)
(+|-)H[H][:M[M]]
Z
Exemples
-08:00
-8:15
+3:00
+07:30
-7
Z
Lorsque vous utilisez ce format, aucune espace n'est autorisée entre le fuseau horaire et le reste de l'horodatage.
2014-09-27 12:30:00.45-8:00
2014-09-27T12:30:00.45Z
Nom de fuseau horaire
continent/[region/]city
Les noms de fuseau horaire proviennent de la base de données tz. Pour obtenir des informations de référence moins complètes mais plus simples, consultez l'article Wikipédia List of tz database time zones (Liste des fuseaux horaires de la base de données tz).
Exemples
America/Los_Angeles
America/Argentina/Buenos_Aires
Lorsque vous utilisez un nom de fuseau horaire, une espace est requise entre le nom et le reste de l'horodatage :
2014-09-27 12:30:00.45 America/Los_Angeles
Sachez que les noms de fuseau horaire ne sont pas tous interchangeables, même s'ils signalent la même heure au cours d'une partie de l'année. Par exemple, America/Los_Angeles
signale la même heure que le fuseau horaire UTC-7:00
pendant l'heure d'été. En revanche, hors de cette période, il signale la même heure que le fuseau horaire UTC-8:00
.
Si aucun fuseau horaire n'est spécifié, la valeur de fuseau horaire par défaut est utilisée.
Secondes intercalaires
Un horodatage est simplement un décalage depuis le 1970-01-01 00:00:00 UTC, supposant qu'il y ait exactement 60 secondes par minute. Les secondes intercalaires ne sont pas représentées dans un horodatage stocké.
Si votre entrée contient des valeurs qui utilisent ":60" dans le champ des secondes pour représenter une seconde intercalaire, cette seconde intercalaire n'est pas conservée lors de la conversion en valeur d'horodatage. Cette valeur est plutôt interprétée comme un horodatage comprenant ":00" dans le champ des secondes de la minute suivante.
Les secondes intercalaires n'affectent pas les calculs d'horodatage. Ces calculs utilisent les horodatages de type Unix, qui ne reflètent pas les secondes intercalaires. Les secondes intercalaires ne sont observables que par le biais de fonctions qui mesurent le temps réel. Dans ces fonctions, il est possible qu'une seconde d'horodatage soit ignorée ou répétée s'il existe une seconde intercalaire.