

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 数据类型
<a name="sql-reference-data-types"></a>

下表汇总了 Amazon Kinesis Data Analytics 支持的数据类型。


| SQL 数据类型 | JSON 数据类型 | 说明 | 注意 | 
| --- | --- | --- | --- | 
|  BIGINT  | 数字 |  64 位有符号整数  | 
|  BINARY  | BASE64-编码后的字符串 |  二进制（非字符）数据  |  子字符串适用于 BINARY。联接对 BINARY 不起作用。  | 
|  BOOLEAN  | 布尔值 |  TRUE、FALSE 或 NULL  |  计算结果为 TRUE、FALSE 和 UNKNOWN。  | 
|  CHAR (n)  | 字符串 |  固定长度 n 的字符串。也可指定为 CHARACTER  |  n 必须大于 0 且小于 65535。  | 
|  DATE  | 字符串 |  日期是日历日 (year/month/day)。  |  精度是日。范围介于最大值 [大约 \$1229（以年为单位）] 到最小值 -229 之间。  | 
|  DECIMAL DEC NUMERIC  | 数字 |  一个固定点，最多包含 19 位有效数字。  |  可以用 DECIMAL、DEC 或 NUMERIC 指定。  | 
|  DOUBLE DOUBLE PRECISION  | 数字 |  64 位浮点数  |  64 位近似值；-1.79E\$1308 至 1.79E\$1308。采用 ISO DOUBLE PRECISION 数据类型，53 位用于科学计数法中的数字尾数，表示 15 位数的精度和 8 字节的存储空间。  | 
|  INTEGER INT  | 数字 |   |  32 位带符号的整数。范围介于 -2147483648 到 2147483647 [ 2\$1\$1(31) to 2\$1\$1(31)- 1] 之间  | 
|  INTERVAL <timeunit> [TO <timeunit>]  | 字符串 |  支持日-时间间隔，不支持年-月间隔  |  在采用日期算法的表达式中允许，但不可用作表或流中列的数据类型。  | 
|  <timeUnit>  | 字符串 |  INTERVAL 值的单位  |  支持的单位为 YEAR、MONTH、DAY、HOUR、MINUTE 和 SECOND  | 
|  SMALLINT  | 数字 |  16 位有符号整数  |  范围介于 -32768 到 32767 之间  [2\$1\$1(15) to 2\$1\$1(15)-1]  | 
|  REAL  | 数字 |  32 位浮点数  |  采用 ISO REAL 数据类型，24 位用于科学计数法中的数字尾数，表示 7 位数的精度和 4 字节的存储空间。最小值为 -3.40E\$138；最大值为 3.40E\$138。  | 
|  TIME  | 字符串 |  TIME 是一天中的时间 (hour:minute:second)。  |  其精度是毫秒；其范围是 00:00:00.000 到 23:59:59.999。由于系统时钟采用 UTC，因此不考虑用于 TIME 或 TIMESTAMP 列中存储的值的时区。 用于 TIME 或 TIMESTAMP 列中存储的值。  | 
|  TIMESTAMP  | 字符串 |  TIMESTAMP 是 DATE 和 TIME 的组合。  |  TIMESTAMP 值的精度始终为 1 毫秒。没有特定的时区。由于系统时钟采用 UTC，因此不考虑用于 TIME 或 TIMESTAMP 列中存储的值的时区。范围介于最大值 [大约 \$1229（以年为单位）] 到最小值 -229 之间。每个时间戳都存储为带符号的 64 位整数，其中 0 表示 Unix 时代 (1970 年 1 月 1 日零点)。这意味着最大的 TIMESTAMP 值代表 1970 年之后的大约 3 亿年，最小的值代表 1970 年之前的大约 3 亿年。根据 SQL 标准，TIMESTAMP 值的时区未定义。  | 
|  TINYINT  | 数字 |  8 位有符号整数  |  范围介于 -128 到 127 之间  | 
|  VARBINARY (n)  | BASE64-编码后的字符串 |  也可指定为 BINARY VARYING  |  n 必须大于 0 且小于 65535。  | 
|  VARCHAR (n)  | 字符串 |  也可指定为 CHARACTER VARYING  |  n 必须大于 0 且小于 65535。  | 
<a name="NOTE1"></a>
**注意**  
关于字符：
+ 亚马逊 Kinesis Data Analytics 仅支持 Java 单字节字符 SETs。
+ 不支持隐式类型转换。也就是说，当且仅当字符取自相同的字符库并且是数据类型为 CHARACTER 或 CHARACTER VARYING 的值时，字符才可以相互分配。

关于数字：
+ 如果数字是数据类型为 NUMERIC、DECIMAL、INTEGER、BIGINT、SMALLINT、TINYINT、REAL 和 DOUBLE PRECISION 的值，则可以相互比较和相互分配。

以下数据类型集是同义词：
+ DEC 和 DECIMAL
+ DOUBLE PRECISION 和 DOUBLE
+ CHARACTER 和 CHAR
+ CHAR VARYING 或 CHARACTER VARYING 和 VARCHAR
+ BINARY VARYING 和 VARBINARY
+ INT 和 INTEGER
+ 二进制值（数据类型为 BINARY 和 BINARY VARYING）始终可以相互比较，并且可以相互分配。

关于日期、时间和时间戳：
+ 不支持隐式类型转换（也就是说，只有当分配的源和目标都是 DATE、TIME 或 TIMESTAMP 类型时，日期时间值才可以相互分配）。
+ Amazon Kinesis Data Analytics 时区始终采用 UTC。时间函数，包括 Amazon Kinesis Data Analytics 扩展 CURRENT\$1ROW\$1TIMESTAMP，以 UTC 返回时间。

# 数字类型和精度
<a name="sql-reference-numeric-types-precision"></a>

对于 DECIMAL，我们最多支持 18 位数的精度和小数位数。

精度指定列中可存储的最大小数位数，包括小数点右侧和左侧的小数位数。您可以指定从 1 位到 18 位的精度，也可以使用 18 位的默认精度。

小数位数指定小数点右侧可存储的最大位数。小数位数必须小于或等于精度。您可以指定介于 0 到 18 位之间的小数位数，也可以使用 0 位的默认小数位数。

**除法规则**  
假设 p1、s1 是第一个运算对象的精度和小数位数，例如 DECIMAL (10,1)。

假设 p2、s2 是第二个运算对象的精度和小数位数，例如 DECIMAL (10,3)。

假设 p、s 是结果的精度和小数位数。

假设 d 为结果中的整数位数。然后，结果类型为小数，如下所示：


|  |  | 
| --- |--- |
|  d = p1 - s1 \$1 s2  |  D = 10 - 1 \$1 3 结果中的整数位数 = 6  | 
|  s <= MAX (6, s1 \$1 p2 \$11)  |  S <= MAX (6, 1 \$1 10 \$1 1) 结果的小数位数 = 14  | 
|  p = d \$1 s  |  结果的精度 = 18  | 

精度和小数位数上限为其最大值（18，其中小数位数不能大于精度）。

优先级是首先给出至少第一个参数的小数位数 (s >= s1)，然后再加上足够的整数来表示结果而不会溢出

**乘法规则**  
假设 p1、s1 是第一个运算对象 DECIMAL (10,1) 的精度和小数位数。

假设 p2、s2 是第二个运算对象 DECIMAL (10,3) 的精度和小数位数。

假设 p、s 是结果的精度和小数位数。

然后，结果类型为小数，如下所示：


|  |  | 
| --- |--- |
|  p = p1 \$1 p2  |  p = 10 \$1 10 结果的精度 = 18  | 
|  s = s1 \$1 s2  |  s = 1 \$1 3 结果的小数位数 = 4  | 

**求和或减法规则**  
类型推断策略，调用的结果类型是两个精确数字运算对象的小数之和，其中至少有一个运算对象是小数。

假设 p1、s1 是第一个运算对象 DECIMAL (10,1) 的精度和小数位数。

假设 p2、s2 是第二个运算对象 DECIMAL (10,3) 的精度和小数位数。

假设 p、s 是结果的精度和小数位数，如下所示：


|  |  | 
| --- |--- |
|  s = max(s1, s2)  |  s = max (1,3) 结果的小数位数 = 3  | 
|  p = max(p1 - s1, p2 - s2) \$1 s \$1 1  |  p = max(10-1,10-3) \$1 3 \$1 1 结果的精度 = 11  | 

s 和 p 的上限为其最大值