

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

# Amazon Keyspaces 中的 Cassandra 查询语言 (CQL) 元素
<a name="cql.elements"></a>

了解 Amazon Keyspaces 支持的 Cassandra 查询语言 (CQL) 元素，包括标识符、常量、术语和数据类型。

**Topics**
+ [identifier](#cql.elements.identifier)
+ [constants](#cql.elements.constants)
+ [term](#cql.elements.term)
+ [数据类型](#cql.data-types)
+ [Amazon Keyspaces 数据类型的 JSON 编码](#cql.data-types.JSON)

## 标识符
<a name="cql.elements.identifier"></a>

标识符（或名称）用于标识表、列和其他对象。标识符可以带引号，也可以不带引号。以下情况将适用。

```
identifier          ::=  unquoted_identifier | quoted_identifier
unquoted_identifier ::=  re('[a-zA-Z][a-zA-Z0-9_]*')
quoted_identifier   ::=  '"' (any character where " can appear if doubled)+ '"'
```

## 常量
<a name="cql.elements.constants"></a>

定义以下常量。

```
constant ::=  string | integer | float | boolean | uuid | blob | NULL
string   ::=  '\'' (any character where ' can appear if doubled)+ '\''
              '$$' (any character other than '$$') '$$'
integer  ::=  re('-?[0-9]+')
float    ::=  re('-?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9+])?') | NAN | INFINITY
boolean  ::=  TRUE | FALSE
uuid     ::=  hex{8}-hex{4}-hex{4}-hex{4}-hex{12}
hex      ::=  re("[0-9a-fA-F]")
blob     ::=  '0' ('x' | 'X') hex+
```

## 术语
<a name="cql.elements.term"></a>

术语表示受支持的值的类型。术语由以下内容定义。

```
term                 ::=  constant | literal | function_call | arithmetic_operation | type_hint | bind_marker
literal              ::=  collection_literal | tuple_literal
function_call        ::=  identifier '(' [ term (',' term)* ] ')'
arithmetic_operation ::=  '-' term | term ('+' | '-' | '*' | '/' | '%') term
```

## 数据类型
<a name="cql.data-types"></a>

Amazon Keyspaces 支持以下数据类型：

### 字符串类型
<a name="cql.data-types.string"></a>


****  

| 数据类型 | 说明 | 
| --- | --- | 
|  `ascii`  | 表示 ASCII 字符串。 | 
|  `text`  | 表示 UTF-8 编码的字符串。 | 
|  `varchar`  |  表示 UTF-8 编码的字符串（`varchar` 是 `text` 的别名）。  | 

### 数字类型
<a name="cql.data-types.numeric"></a>


****  

| 数据类型 | 说明 | 
| --- | --- | 
|  `bigint`  | 表示 64 位有符号长整型。 | 
|  `counter`  | 表示 64 位有符号整数计数器。有关更多信息，请参阅 [计数器](#cql.data-types.numeric.counters)。 | 
|  `decimal`  | 表示可变精度小数。 | 
|  `double`  | 表示 64 位 IEEE 754 浮点。 | 
|  `float`  | 表示 32 位 IEEE 754 浮点。 | 
|  `int`  |  表示 32 位有符号整数。  | 
|  `varint`  |  表示 \$1/-10^38 范围内的整数值。  | 

#### 计数器
<a name="cql.data-types.numeric.counters"></a>

`counter` 列包含 64 位有符号整数。计数器值通过 [UPDATE](cql.dml.update.md) 语句进行递增或递减，并且无法直接设置。这使得 `counter` 列对于跟踪计数很有用。例如，您可以使用计数器来跟踪日志文件中的条目数或帖子在社交网络上被查看的次数。以下限制适用于 `counter` 列：
+ 类型 `counter` 的列不能是表的 `primary key` 的一部分。
+ 在包含一个或多个类型 `counter` 的列的表中，所有列的类型都必须为 `counter`。

如果计数器更新失败（例如，因超时或与 Amazon Keyspaces 的连接断开），客户端将不知道计数器值是否已更新。如果重试更新，则可能会再次应用对计数器值的更新。

### Blob 类型
<a name="cql.data-types.blob"></a>


****  

| 数据类型 | 说明 | 
| --- | --- | 
|  `blob`  | 表示任意字节。 | 

### 布尔值类型
<a name="cql.data-types.boolean"></a>


****  

| 数据类型 | 说明 | 
| --- | --- | 
|  `boolean`  | 表示 true 或 false。 | 

### 与时间相关的类型
<a name="cql.data-types.time"></a>


****  

| 数据类型 | 说明 | 
| --- | --- | 
|  `date`  | 格式为的字符串<yyyy>-<mm>-<dd>。 | 
|  `timestamp`  | 64 位有符号整数，表示自纪元（1970 年 1 月 1 日 00:00:00 GMT）以来的日期和时间，以毫秒为单位。 | 
|  `timeuuid`  | 表示[版本 1 UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address))。 | 

### 集合类型
<a name="cql.data-types.collection"></a>


****  

| 数据类型 | 说明 | 
| --- | --- | 
|  `list`  | 表示文本元素的有序集合。 | 
|  `map`  | 表示键/值对的无序集合。 | 
|  `set`  | 表示一个或多个文本元素的无序集合。 | 

您将通过在尖括号中使用集合类型后跟其他数据类型（如 `TEXT` 或 `INT`）来声明集合列。您可以创建包含 `TEXT` 的 `SET` 的列，也可以创建 `TEXT` 和 `INT` 键值对的 `MAP`，如以下示例所示。

```
SET <TEXT>
MAP <TEXT, INT>
```

*非冻结*集合可让您对每个单独的集合元素进行更新。系统将为各个元素存储客户端时间戳和存活时间 (TTL) 设置。

当您对集合类型使用 `FROZEN` 关键字时，集合的值将被序列化为单个不可变值，并且 Amazon Keyspaces 会将它们视为 `BLOB`。这是一个*冻结*集合。`INSERT` 或 `UPDATE` 语句将覆盖整个冻结集合。您无法对冻结集合中的单个元素进行更新。

客户端时间戳和存活时间 (TTL) 设置适用于整个冻结集合，而不是单个元素。`Frozen` 集合列可以是表的 `PRIMARY KEY` 的一部分。

您可以嵌套冻结集合。例如，如果 `MAP` 使用了 `FROZEN` 关键字，您可以在 `SET` 中定义 `MAP`，如以下示例所示。

```
SET <FROZEN> <MAP <TEXT, INT>>>
```

默认情况下，Amazon Keyspaces 支持嵌套多达 8 个级别的冻结集合。有关更多信息，请参阅 [Amazon Keyspaces 服务限额](quotas.md#table)。有关 Apache Cassandra 的功能差异的更多信息，请参阅 [`FROZEN` 集合](functional-differences.md#functional-differences.frozen-collections)。有关 CQL 语法的更多信息，请参阅 [CREATE TABLE](cql.ddl.table.md#cql.ddl.table.create) 和 [ALTER TABLE](cql.ddl.table.md#cql.ddl.table.alter)。

### 元组类型
<a name="cql.data-types.tuple"></a>

`tuple` 数据类型表示一组有界的文本元素。您可以使用元组作为 `user defined type` 的替代项。您无需将 `FROZEN` 关键字用于元组。这是因为元组始终处于冻结状态，您无法单独更新元素。

### 其他类型
<a name="cql.data-types.other"></a>


****  

| 数据类型 | 说明 | 
| --- | --- | 
|  `inet`  | 表示 IP 地址的字符串， IPv6采用 IPv4 或格式。 | 

### 静态
<a name="cql.data-types.static"></a>

在包含集群列的 Amazon Keyspaces 表中，您可以使用 `STATIC` 关键字来创建任何类型的静态列。

下面是一个示例语句。

```
my_column INT STATIC
```

有关使用静态列的更多信息，请参阅[估算 Amazon Keyspaces 中静态列的容量消耗](static-columns.md)。

### 用户定义的类型 (UDTs)
<a name="cql.data-types.user-defined"></a>

Amazon Keyspaces 支持用户定义的类型 () UDTs。您可以使用任何有效的 Amazon Keyspaces 数据类型来创建 UDT，包括集合和其他现有数据类型。 UDTs您可以在密钥空间 UDTs 中创建，并可以使用它们来定义密钥空间中任何表中的列。

有关 CQL 语法的更多信息，请参阅 [用户定义的类型 (UDTs)](cql.ddl.type.md)。有关使用的更多信息 UDTs，请参阅[Amazon Keys UDTs paces 中的用户定义类型 ()](udts.md)。

要查看每个密钥空间支持 UDTs 多少密钥空间、支持的嵌套级别以及与之相关的其他默认值和配额 UDTs，请参阅。[Amazon Keyspaces 中用户定义类型 (UDTs) 的配额和默认值](quotas.md#quotas-udts)

## Amazon Keyspaces 数据类型的 JSON 编码
<a name="cql.data-types.JSON"></a>

Amazon Keyspaces 提供与 Apache Cassandra 相同的 JSON 数据类型映射。下表介绍了 Amazon Keyspaces 在 `INSERT JSON` 语句中接受的数据类型，以及 Amazon Keyspaces 在使用 `SELECT JSON` 语句返回数据时使用的数据类型。

对于单字段数据类型（如 `float`、`int`、`UUID` 和 `date`），您还可以将数据作为 `string` 插入。对于复合数据类型和集合（如 `tuple`、`map` 和 `list`），您还可以将数据作为 JSON 或编码 `JSON string` 插入。


****  

| JSON 数据类型 | `INSERT JSON` 语句中接受的数据类型 | `SELECT JSON` 语句中返回的数据类型 | 注意 | 
| --- | --- | --- | --- | 
|  `ascii`  | string | string | 使用 JSON 字符转义 `\u`。 | 
|  `bigint`  | integer, string | integer | 字符串必须是有效的 64 位整数。 | 
|  `blob`  | string | string | 字符串应以 `0x` 开头，后跟偶数个十六进制数字。 | 
|  `boolean`  | boolean, string | boolean | String 必须为 `true` 或 `false`。 | 
|  `date`  | string | string | 格式为 `YYYY-MM-DD` 的日期，时区为 UTC。 | 
|  `decimal`  | integer, float, string | float | 在客户端解码器中，浮点精度可以超过 32 位或 64 位 IEEE-754。 | 
|  `double`  | integer, float, string | float | 字符串必须是有效的整数或浮点数。 | 
|  `float`  | integer, float, string | float | 字符串必须是有效的整数或浮点数。 | 
|  `inet`  | string | string | IPv4 或 IPv6 地址。 | 
|  `int`  | integer, string | integer | 字符串必须是有效的 32 位整数。 | 
|  `list`  | list, string | list | 使用原生 JSON 列表表示形式。 | 
|  `map`  | map, string | map | 使用原生 JSON 映射表示形式。 | 
|  `smallint`  | integer, string | integer | 字符串必须是有效的 16 位整数。 | 
|  `set`  | list, string | list | 使用原生 JSON 列表表示形式。 | 
|  `text`  | string | string | 使用 JSON 字符转义 `\u`。 | 
|  `time`  | string | string | 一天中的时间，格式为 `HH-MM-SS[.fffffffff]`。 | 
|  `timestamp`  | integer, string | string | 时间戳。字符串常量可让您将时间戳存储为日期。将返回格式为 `YYYY-MM-DD HH:MM:SS.SSS` 的日期戳。 | 
|  `timeuuid`  | string | string | 类型 1 UUID。有关 UUID 格式的信息，请参阅[constants](#cql.elements.constants)。 | 
|  `tinyint`  | integer, string | integer | 字符串必须是有效的 8 位整数。 | 
|  `tuple`  | list, string | list | 使用原生 JSON 列表表示形式。 | 
|  `UDT`  | map, string | map | 使用带有字段名称的本地 JSON 地图表示形式作为键。 | 
|  `uuid`  | string | string | 有关 UUID 格式的信息，请参阅[constants](#cql.elements.constants)。 | 
|  `varchar`  | string | string | 使用 JSON 字符转义 `\u`。 | 
|  `varint`  | integer, string | integer | 可变长度；在客户端解码器中，可能会溢出 32 位或 64 位整数。 | 