# 值型別與寫入語意

本頁說明 ToriiDB 如何判定儲存值的型別，以及 `SetDefault`、`SetNX`、`SetXX` 寫入時的行為。

## 值型別

每次寫入都會依下列順序從原始字串偵測型別：

| 順序 | 型別 | 規則 | `String()` |
|---|---|---|---|
| 1 | `TypeJSON` | 合法 JSON，且去除空白後以 `{`/`[` 開頭、`}`/`]` 結尾 | `json` |
| 2 | `TypeInt` | `strconv.ParseInt(value, 10, 64)` 成功 | `int` |
| 3 | `TypeFloat` | `strconv.ParseFloat(value, 64)` 成功 | `float` |
| 4 | `TypeBool` | 恰為 `true` 或 `false` | `bool` |
| 5 | `TypeDate` | RFC 3339 或 `2006-01-02` | `date` |
| 6 | `TypeString` | 其他 | `string` |

`"007"` 會被判為 `int`，但它不是合法 JSON number；因此 daemon 在把這類值當成原始 JSON 送出前會再用 `json.Valid` 檢查。

## 寫入語意

| Flag | 行為 |
|---|---|
| `SetDefault` | Upsert |
| `SetNX` | 鍵已存在時失敗：`key already exists` |
| `SetXX` | 鍵不存在時失敗：`key not found` |

覆寫鍵會取代值、型別與 `ExpireAt`，設定 `UpdatedAt`，並清除 `Vector`，因為舊 embedding 已不代表新文字。`expireAt` 是絕對 Unix 時間戳；REPL 會把結尾的 `<seconds>` 轉成時間戳。

## 相關頁面

- [核心概念](/zh/core-concepts)
- [JSON 文件](/zh/json-documents)
- [SET、DEL、INCR](/zh/cli-reference-write)
