欄位的資料型態
MySQL 的欄位資料型態可大致分為以下幾類:
## 1. 數值型態
### 整數型態
| 型態 | 說明 | 有號範圍概略 |
|---|---|---|
| `TINYINT` | 非常小的整數,通常佔 1 位元組 | -128 ~ 127 |
| `SMALLINT` | 小型整數,佔 2 位元組 | -32,768 ~ 32,767 |
| `MEDIUMINT` | 中型整數,佔 3 位元組 | 約 -838 萬 ~ 838 萬 |
| `INT` 或 `INTEGER` | 最常用的整數,佔 4 位元組 | 約 -21 億 ~ 21 億 |
| `BIGINT` | 大型整數,佔 8 位元組 | 非常大的整數範圍 |
可搭配 `UNSIGNED`,表示不允許負數,並將可用範圍移至正數。例如:
```sql
age TINYINT UNSIGNED
id BIGINT UNSIGNED
```
> `INT(11)` 中的 `11` 並不是儲存長度,而是舊版 MySQL 的顯示寬度,目前通常不需要使用。
### 固定或浮點數型態
| 型態 | 說明 |
|---|---|
| `DECIMAL(M,D)` | 精確小數,適合金額、財務資料 |
| `FLOAT` | 單精度浮點數,適合一般近似數值 |
| `DOUBLE` | 雙精度浮點數,精確度高於 `FLOAT` |
例如:
```sql
price DECIMAL(10,2)
```
表示最多 10 位數,其中 2 位為小數,適合儲存 `12345678.90` 這類金額。
---
## 2. 字串型態
### `CHAR`
固定長度字串。
```sql
country_code CHAR(2)
```
適合長度固定的資料,例如國家代碼、固定格式的編號。若實際內容較短,MySQL 會以空白補足。
### `VARCHAR`
可變長度字串,最常用的文字型態。
```sql
name VARCHAR(100)
email VARCHAR(255)
```
適合姓名、電子郵件、地址等長度不固定的資料。`VARCHAR(n)` 中的 `n` 表示最大字元數,但實際限制也會受到字元集和資料列總長度影響。
### `TEXT` 系列
適合儲存較長的文字:
| 型態 | 最大大小概略 |
|---|---:|
| `TINYTEXT` | 255 bytes |
| `TEXT` | 65,535 bytes |
| `MEDIUMTEXT` | 約 16 MB |
| `LONGTEXT` | 約 4 GB |
例如文章內容、備註、HTML 或大量文字可使用 `TEXT`。
> `TEXT` 欄位通常不能設定一般的預設值,且索引使用上也比 `VARCHAR` 受限制。
### `ENUM`
從預先定義的選項中選擇一個值。
```sql
status ENUM('pending', 'paid', 'cancelled')
```
適合選項固定且數量少的欄位,但若選項經常變更,通常改用獨立資料表或 `VARCHAR` 會較有彈性。
### `SET`
可從多個預先定義的選項中選擇多個值。使用情境較少,設計上需謹慎。
---
## 3. 日期與時間型態
| 型態 | 說明 |
|---|---|
| `DATE` | 日期,例如 `2025-03-08` |
| `TIME` | 時間,例如 `14:30:00` |
| `DATETIME` | 日期與時間,例如 `2025-03-08 14:30:00` |
| `TIMESTAMP` | 日期與時間,常用於建立時間、更新時間 |
| `YEAR` | 年份 |
### `DATETIME` 與 `TIMESTAMP`
- `DATETIME` 儲存指定的日期時間,範圍較大。
- `TIMESTAMP` 通常以 UTC 儲存,顯示時依時區轉換,適合記錄建立時間和更新時間。
- `TIMESTAMP` 的可表示範圍通常小於 `DATETIME`。
常見寫法:
```sql
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
```
---
## 4. 二進位資料型態
### `BINARY` 與 `VARBINARY`
用於儲存二進位資料,例如雜湊值、加密資料或特殊編碼內容。
```sql
hash_value BINARY(32)
```
### `BLOB` 系列
用於儲存大量二進位資料,例如圖片、檔案或影音資料。
| 型態 | 最大大小概略 |
|---|---:|
| `TINYBLOB` | 255 bytes |
| `BLOB` | 65,535 bytes |
| `MEDIUMBLOB` | 約 16 MB |
| `LONGBLOB` | 約 4 GB |
實務上,大型檔案通常會放在檔案系統或物件儲存服務,資料庫只保存檔案路徑或 URL。
---
## 5. JSON 型態
`JSON` 用於儲存 JSON 格式資料:
```sql
profile JSON
```
例如:
```json
{
"nickname": "Amy",
"interests": ["music", "travel"]
}
```
優點:
- 可儲存結構不固定的資料
- MySQL 提供 JSON 查詢與操作函式
- 某些 JSON 路徑可以建立索引
但若資料結構固定且需要大量查詢,通常仍建議使用一般欄位或關聯式資料表。
---
## 6. 空間資料型態
MySQL 也支援地理與幾何資料,例如:
- `GEOMETRY`
- `POINT`
- `LINESTRING`
- `POLYGON`
常用於地圖座標、路徑、區域範圍等資料。
例如:
```sql
location POINT
```
---
## 7. 其他常見欄位屬性
資料型態之外,欄位還可以設定以下屬性:
```sql
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
```
- `NOT NULL`:不允許儲存 `NULL`
- `NULL`:允許沒有值
- `DEFAULT`:指定預設值
- `AUTO_INCREMENT`:自動遞增,常用於流水號主鍵
- `PRIMARY KEY`:主鍵,唯一識別資料列
- `UNIQUE`:不允許重複值
- `COMMENT`:欄位註解
- `COLLATE`:指定字串排序與比較規則
## 常見選擇建議
- 整數編號:`INT UNSIGNED` 或 `BIGINT UNSIGNED`
- 金額:`DECIMAL(10,2)`,不要使用 `FLOAT`
- 一般短文字:`VARCHAR`
- 長篇文字:`TEXT`
- 建立、更新時間:`DATETIME` 或 `TIMESTAMP`
- 固定選項:視情況使用 `ENUM`
- 結構彈性的資料:`JSON`
- 圖片或檔案:通常儲存路徑,避免直接存入 `BLOB`,除非有特殊需求。
相關學習地圖、教學課程
Python 後端工程、資料庫