旧版 SQL 数据类型

本文档详细介绍了 BigQuery 的旧版 SQL 查询语法支持的数据类型。BigQuery 的首选查询语法是标准 SQL。如需详细了解标准 SQL 中的数据类型,请参阅标准 SQL 数据类型

旧版 SQL 数据类型

您的数据可包含以下数据类型:

数据类型 可能的值
STRING 长度可变的字符 (UTF-8) 数据。
BYTES 长度可变的二进制数据。
  • 导入的 BYTES 数据必须采用 base64 编码(Avro BYTES 数据除外,BigQuery 可以读取和转换此类数据)。
  • 从 BigQuery 表读取的 BYTES 数据采用 base64 编码(除非导出为 Avro 格式,此时数据类型为 Avro BYTES)。
INTEGER

64 位有符号整数。

如果您使用 BigQuery API 加载 [-253+1, 253-1] 范围以外的整数(在大多数情况下,表示大于 9,007,199,254,740,991)到整数 (INT64) 列时,您必须将其作为字符串传递,以避免数据损坏。此问题是由 JSON/ECMAScript 中的整数大小限制引起的。如需了解详情,请参阅 RFC 7159 的“数字”部分

FLOAT 双精度浮点格式。
NUMERIC 旧版 SQL 对 NUMERIC 提供有限支持。如需了解详情,请参阅旧版 SQL 中的精确数字
BIGNUMERIC(预览版 旧版 SQL 对 BIGNUMERIC 提供有限支持。如需了解详情,请参阅旧版 SQL 中的精确数字
BOOLEAN
  • CSV 格式10truefalsetfyesnoyn(均不区分大小写)。
  • JSON 格式truefalse(不区分大小写)。
RECORD 一个或多个其他字段的集合。
TIMESTAMP

您可以使用 UNIX 时间戳或日历日期时间来描述 TIMESTAMP 数据类型。BigQuery 在内部将 TIMESTAMP 数据存储为 UNIX 时间戳并精确到微妙。

UNIX 时间戳

正十进制数或负十进制数。正数表示从纪元 (1970 年 1 月 1 日 00:00:00 UTC) 开始所经过的秒数,负数表示纪元之前的秒数。最多保留 6 个小数位(精确到微秒)。

日期和时间字符串

日期和时间字符串采用如下格式:YYYY-MM-DD HH:MM:SS。支持使用 UTCZ 说明符。

您可以在日期和时间字符串中提供时区偏移,但 BigQuery 在将值转换为内部格式后不会保留此偏移。如果您需要保留原始时区数据,请将时区偏移单独存储在一列中。指定单数位时区偏移时,需要添加前导零。

使用 JSON 格式时,必须用引号将日期和时间字符串引起来。

示例

以下示例显示了使用 UNIX 时间戳格式与日期和时间字符串格式描述特定日期的等效方式。

事件 UNIX 时间戳格式 日期/时间字符串格式
俄克拉荷马城附近发生小震 (M4.2)

1408452095.220
1408452095.220000

2014-08-19 07:41:35.220 -05:00
2014-08-19 12:41:35.220 UTC
2014-08-19 12:41:35.220
2014-08-19 12:41:35.220000
2014-08-19T12:41:35.220Z
尼尔·阿姆斯特朗登上月球

-14182916

1969-07-20 20:18:04
1969-07-20 20:18:04 UTC
1969-07-20T20:18:04
Y10k 错误的最后修复期限

253402300800
2.53402300800e11

10000-01-01 00:00
DATE 旧版 SQL 对 DATE 提供有限支持。如需了解详情,请参阅旧版 SQL 中的民用时间
TIME 旧版 SQL 对 TIME 提供有限支持。如需了解详情,请参阅旧版 SQL 中的民用时间
DATETIME 旧版 SQL 对 DATETIME 提供有限支持。如需了解详情,请参阅旧版 SQL 中的民用时间

旧版 SQL 中的精确数字

您可以在非修改子句(例如 SELECT list (with aliases)GROUP BY keys 和分析函数中的传递字段等)中读取 NUMERIC 或 BIGNUMERIC 值。但是,对 NUMERIC 或 BIGNUMERIC 值的任何计算(包括比较)都会产生不确定的结果。

旧版 SQL 支持以下类型转换和转换函数:

  • CAST(<numeric> AS STRING)
  • CAST(<bignumeric> AS STRING)
  • CAST(<string> AS NUMERIC)
  • CAST(<string> AS BIGNUMERIC)

旧版 SQL 中的民用时间

您可以读取民用时间数据类型(DATE、TIME 和 DATETIME),并使用非修改性运算符(例如 SELECT list (with aliases)GROUP BY keys 和分析函数中的传递字段等)处理它们。但是,对民用时间值的任何其他计算(包括比较)都会产生不确定的结果。

旧版 SQL 支持以下类型转换和转换函数:

  • CAST(<date> AS STRING)
  • CAST(<time> AS STRING)
  • CAST(<datetime> AS STRING)
  • CAST(<string> AS DATE)
  • CAST(<string> AS TIME)
  • CAST(<string> AS DATETIME)

实际上,旧版 SQL 将民用时间值解释为整数,对代表民用时间值的整数执行的操作会产生意外结果。

如需使用民用时间数据类型计算值,请考虑采用标准 SQL,它支持 DATEDATETIMETIME 数据类型的所有 SQL 操作。

后续步骤