

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon DynamoDB 中支援的資料類型和命名規則
<a name="HowItWorks.NamingRulesDataTypes"></a>

本節說明 Amazon DynamoDB 命名規則與 DynamoDB 支援的各種資料類型。這些資料類型有所限制。如需詳細資訊，請參閱 [資料類型](Constraints.md#limits-data-types)。

**Topics**
+ [命名規則](#HowItWorks.NamingRules)
+ [資料類型](#HowItWorks.DataTypes)
+ [資料類型描述項](#HowItWorks.DataTypeDescriptors)

## 命名規則
<a name="HowItWorks.NamingRules"></a>

DynamoDB 中的資料表、屬性與其他物件必須具有名稱。名稱應該具有意義且簡潔，例如 *Products*、*Books* 與 *Authors* 等都是一目了然的名稱。

以下是 DynamoDB 的命名規則：
+ 所有名稱都必須使用 UTF-8 編碼並區分大小寫。
+ 資料表名稱與索引名稱長度必須介於 3 到 255 個字元之間，而且只能包含下列字元：
  + `a-z`
  + `A-Z `
  + ` 0-9 `
  + `_` (底線)
  + `-` (破折號)
  + `.` (點號)
+ 屬性名稱至少必須為一個字元長，而且大小不能超過 64KB。屬性名稱盡可能簡潔是公認的最佳實務。這有助於減少使用的讀取請求單位，因為屬性名稱包含在儲存體和輸送量使用量的計量中。

  以下為例外狀況。這些屬性名稱絕對不能超過 255 個字元。
  + 次要索引分割區索引鍵名稱
  + 次要索引排序索引鍵名稱
  + 任何使用者指定的投影屬性名稱 (僅適用於本機次要索引) 

### 保留字與特殊字元
<a name="HowItWorks.NamingRules.Reserved"></a>

DynamoDB 有一份保留字與特殊字元清單。如需完整清單，請參閱 [DynamoDB 中的保留字](ReservedWords.md)。此外，下列字元在 DynamoDB 中具有特殊意義：**\$1** (井字號) 與 **:** (冒號)。

雖然 DynamoDB 可讓您將這些保留字與特殊字元用於名稱，但建議您避免這樣做，因為每次在表達式中使用這些名稱，都必須定義預留位置變數。如需詳細資訊，請參閱 [DynamoDB 中的表達式屬性名稱 (別名)](Expressions.ExpressionAttributeNames.md)。

## 資料類型
<a name="HowItWorks.DataTypes"></a>

針對資料表中的屬性，DynamoDB 支援許多不同的資料類型。其可分類如下：
+ **純量類型**：純量類型只能代表一個值。純量類型包括數字、字串、二進位、布林值與 Null。
+ **文件類型**：文件類型可代表具有巢狀屬性的複雜結構，如 JSON 文件中所示。文件類型為清單與映射。
+ **集合類型**：集合類型可代表多個純量值。集合類型包括字串集、數字集與二進位集。

當您建立資料表或次要索引時，您必須指定每個主索引鍵屬性 (分割區索引鍵與排序索引鍵) 的名稱與資料類型。此外，您必須將每個主索引鍵屬性定義為字串、數字或二進位類型。

DynamoDB 是 NoSQL 資料庫且*沒有結構描述*。這表示除了主索引鍵屬性之外，您不需要在建立資料表時定義任何屬性或資料類型。相較之下，關聯式資料庫需要您在建立資料表時定義每個資料行的名稱與資料類型。

以下是每個資料類型的說明，以及 JSON 格式的範例。

### 純量類型
<a name="HowItWorks.DataTypes.Scalar"></a>

純量類型包括數字、字串、二進位、布林值與 Null。

#### Number
<a name="HowItWorks.DataTypes.Number"></a>

數字可以是正數、負數或零。數字精確度最高可達 38 位數。超過此值會導致例外狀況。若您需要比 38 位數更高的精確度，則可以使用字串。
+ 正數範圍：1E-130 到 9.9999999999999999999999999999999999999E\$1125
+ 負數範圍：-9.9999999999999999999999999999999999999E\$1125 到 -1E-130

在 DynamoDB 中，數字會以變數長度表示。前後的零會截去。

所有數字都會以字串形式跨網路傳送到 DynamoDB，以提高語言與程式庫之間的相容性。不過，DynamoDB 會將其視為數學運算的數字類型屬性。

您可以使用數字資料類型來代表日期或時間戳記。一個做法是使用 epoch 時間，也就是自 1970 年 1 月 1 日 00:00:00 UTC 起經過的秒數。例如，epoch 時間 `1437136300` 代表 2015 年 7 月 17 日下午 12:31:40 UTC。

如需詳細資訊，請參閱 [http://en.wikipedia.org/wiki/Unix\$1time](http://en.wikipedia.org/wiki/Unix_time)。

#### String
<a name="HowItWorks.DataTypes.String"></a>

字串是 UTF-8 二進位編碼的 Unicode。如果屬性未用作為索引或資料表的索引鍵，則字串的最小長度可以是零，而且受到最大 DynamoDB 項目大小限制 400 KB 的限制。

下列其他限制適用於定義為類型字串的主索引鍵屬性：
+ 針對簡易主索引鍵，第一個屬性值 (分割區索引鍵) 的長度上限為 2048 位元組。
+ 針對複合主鍵，第二個屬性值 (排序索引鍵) 的長度上限為 1024 位元組。

DynamoDB 會收集並比較使用基本 UTF-8 字串編碼位元組的字串。例如，"`a`" (0x61) 大於 "`A`" (0x41)，而 "`¿`" (0xC2BF) 大於 "`z`" (0x7A)。

您可以使用字串資料類型來代表日期或時間戳記。一個做法是使用 ISO 8601 字串，如下列範例所示：
+ `2016-02-15`
+ `2015-12-21T17:42:34Z`
+ `20150311T122706Z`

如需詳細資訊，請參閱 [http://en.wikipedia.org/wiki/ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601)。

**注意**  
與傳統的關聯式資料庫不同，DynamoDB 原生不支援日期和時間資料類型。使用 Unix Epoch 時間可能很有用，可用於將日期和時間資料儲存為數字資料類型。

#### 二進位
<a name="HowItWorks.DataTypes.Binary"></a>

二進位類型屬性可存放任何二進位資料，例如壓縮文字、加密資料或影像。每當 DynamoDB 比較二進位值時，都會將二進位資料的每個位元組視為不帶正負號。

如果屬性未用作為索引或資料表的索引鍵，則二進制屬性的長度可以是零，而且受到最大 DynamoDB 項目大小限制 400 KB 的限制。

如果您將主索引鍵屬性定義為二進位類型屬性，則會有以下其他限制：
+ 針對簡易主索引鍵，第一個屬性值 (分割區索引鍵) 的長度上限為 2048 位元組。
+ 針對複合主鍵，第二個屬性值 (排序索引鍵) 的長度上限為 1024 位元組。

您的應用程式必須將二進位值編碼為 base64 編碼格式，再傳送到 DynamoDB。收到這些值時，DynamoDB 會將資料解碼為不帶正負號的位元組陣列，並用作二進制屬性長度。

下列範例顯示使用 base64 編碼文字的二進制屬性。

```
dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk
```

#### Boolean
<a name="HowItWorks.DataTypes.Boolean"></a>

布林值類型屬性可存放 `true` 或 `false`。

#### Null
<a name="HowItWorks.DataTypes.Null"></a>

Null 代表具有未知或未定義狀態的屬性。

### 文件類型
<a name="HowItWorks.DataTypes.Document"></a>

文件類型為清單與映射。這些資料類型可彼此互相巢狀來代表複雜的資料結構，最高可達 32 層深。

清單或映射中的值數目不限，只要含有值的項目符合 DynamoDB 項目大小限制 (400 KB)。

 如果屬性不用於資料表或索引鍵，則屬性值可以是空字串或空的二進位值。屬性值不得為空的集合 (字串集合、數字集合或二進位集合)。然而，系統允許空的清單和映射。清單和映射中允許空字串和二進位值。如需詳細資訊，請參閱[屬性](Constraints.md#limits-attributes)。

#### 清單
<a name="HowItWorks.DataTypes.Document.List"></a>

清單類型屬性可存放一組排序的值。清單會以方括號括住：`[ ... ]`

清單類似於 JSON 陣列。清單元素中可存放的資料類型不限，而且清單元素中的元素不必屬於相同類型。

下列範例顯示一個清單，其中包含兩個字串與一個數字。

```
FavoriteThings: ["Cookies", "Coffee", 3.14159]
```

**注意**  
DynamoDB 可讓您使用清單中的個別元素，即使這些元素的巢狀結構很深也一樣。如需詳細資訊，請參閱[在 DynamoDB 中使用表達式](Expressions.md)。

#### Map
<a name="HowItWorks.DataTypes.Document.Map"></a>

映射類型屬性可存放一組未排序的名稱/值對。映射會以大括弧括住：`{ ... }`

映射類似於 JSON 物件。映射元素中可存放的資料類型不限，而且映射中的元素不必屬於相同類型。

映射很適合用來將 JSON 文件存放到 DynamoDB 中。下列範例顯示一個映射，其中包含字串、數字與含有另一個映射的巢狀清單。

```
{
    Day: "Monday",
    UnreadEmails: 42,
    ItemsOnMyDesk: [
        "Coffee Cup",
        "Telephone",
        {
            Pens: { Quantity : 3},
            Pencils: { Quantity : 2},
            Erasers: { Quantity : 1}
        }
    ]
}
```

**注意**  
DynamoDB 可讓您使用映射中的個別元素，即使這些元素的巢狀結構很深也一樣。如需詳細資訊，請參閱[在 DynamoDB 中使用表達式](Expressions.md)。

### 集合
<a name="HowItWorks.DataTypes.SetTypes"></a>

DynamoDB 支援代表數字集合、字串集合或二進位值集合的類型。集合內的所有元素必須屬於相同類型。例如，數字集合只能包含數字，字串集合只能包含字串。

集合中的值數目不限，只要含有值的項目符合 DynamoDB 項目大小限制 (400 KB)。

集合內的每個值必須是唯一的。集合內的值順序不會保留。因此，您的應用程式不得依賴集合內元素的任何特定順序。DynamoDB 不支援空集合，但集合中允許存在空字串和二進位值。

下列範例顯示字串集、數字集與二進位集：

```
["Black", "Green", "Red"]

[42.2, -19, 7.5, 3.14]

["U3Vubnk=", "UmFpbnk=", "U25vd3k="]
```

## 資料類型描述項
<a name="HowItWorks.DataTypeDescriptors"></a>

低階 DynamoDB API 通訊協定使用*資料類型描述項*做為字符，告知 DynamoDB 如何解譯每項屬性。

下列為 DynamoDB 資料類型描述項的完整清單：
+ **`S`**：字串
+ **`N`**：數字
+ **`B`**：二進位
+ **`BOOL`**：布林值
+ **`NULL`**：Null
+ **`M`**：映射
+ **`L`**：清單
+ **`SS`**：字串集合
+ **`NS`**：數字集合
+ **`BS`**：二進位集合