正確的資料類型選型能節省 30%~50% 儲存空間,並顯著提升索引與查詢效能。本文彙整官方文檔與實戰經驗,產出四大類型對照表,附帶選型避坑指南。
| 類型 | 儲存 | 有號範圍 | 無號範圍 | 典型場景 |
|---|---|---|---|---|
| TINYINT | 1 Byte | -128 ~ 127 | 0 ~ 255 | 布爾旗標、極小枚舉 |
| SMALLINT | 2 Bytes | -32,768 ~ 32,767 | 0 ~ 65,535 | 年齡、小範圍計數 |
| MEDIUMINT | 3 Bytes | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等量級 ID |
| INT | 4 Bytes | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 通用主鍵、外鍵 |
| BIGINT | 8 Bytes | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 | 海量 ID、時間戳毫秒 |
建議: 能用 TINYINT 絕不上 SMALLINT;UNSIGNED 可將正數範圍翻倍,適合自增主鍵。
| 類型 | 儲存 | 精度 | 適用場景 |
|---|---|---|---|
| FLOAT | 4 Bytes | 單精度(約 7 位有效數字) | 科學計算、非精確測量 |
| DOUBLE | 8 Bytes | 雙精度(約 15 位有效數字) | 高精度科學計算 |
| DECIMAL(M,D) | M+2 Bytes | 精確定點,字串儲存 | 金額、價格、比率(如 DECIMAL(10,2)) |
鐵律: 任何涉及金錢的欄位禁止使用 FLOAT/DOUBLE,浮點誤差會導致對帳失衡。
| 類型 | 儲存 | 最大長度 | 特性 | 選型建議 |
|---|---|---|---|---|
| CHAR(M) | M Bytes | 255 | 定長,右側空格填充 | 極短固定長(MD5、UUID、國別碼) |
| VARCHAR(M) | L+1/2 Bytes | 65,535 | 變長,實際長度+1/2字節長度前綴 | 通用變長字串,優先選擇 |
| TINYTEXT/BLOB | L+1 | 255 | 不支援 DEFAULT,需完整讀取 | 極少用,建議改 VARCHAR |
| TEXT/BLOB | L+2 | 64 KB | 同上 | 文章內容、JSON 片段 |
| MEDIUMTEXT/BLOB | L+3 | 16 MB | 同上 | 長文檔、圖片二進位 |
| LONGTEXT/BLOB | L+4 | 4 GB | 同上 | 超大物件,慎用 |
| ENUM | 1-2 Bytes | 65,535 成員 | 單選枚舉,內部存數字 | 狀態碼、類別標籤 |
| SET | 1-8 Bytes | 64 成員 | 多選集合,位運算 | 權限位掩碼、標籤組合 |
| 類型 | 儲存 | 格式/範圍 | 時區感知 | 選型建議 |
|---|---|---|---|---|
| DATE | 3 Bytes | YYYY-MM-DD (1000-01-01 ~ 9999-12-31) | 否 | 生日、紀念日 |
| TIME | 3 Bytes | HH:MM:SS (-838:59:59 ~ 838:59:59) | 否 | 時長、排班時間 |
| DATETIME | 8 Bytes | YYYY-MM-DD HH:MM:SS | 否 | 業務時間、日誌記錄(不隨時區變動) |
| TIMESTAMP | 4 Bytes | 1970-01-01 ~ 2038-01-19 | 是(儲存 UTC,讀取轉會話時區) | 建立/更新時間戳、跨時區應用 |
| YEAR | 1 Byte | 1901 ~ 2155 | 否 | 年份歸檔 |
關鍵差異: TIMESTAMP 受時區影響且有 2038 年上限;DATETIME 範圍大且固定,適合業務時間;5.6+ 支援 DATETIME(6) 微秒精度。