數值類型儲存需求
| 類型 | 儲存空間 | 範圍 (有號) | 範圍 (無號) | 適用場景 |
| 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 | 中等計數、RGB 色碼 |
| INT / INTEGER | 4 Bytes | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 通用 ID、計數器、外鍵 |
| BIGINT | 8 Bytes | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 大數據量主鍵、時間戳毫秒 |
| FLOAT | 4 Bytes | ±1.17e-38 ~ ±3.40e38 | — | 單精度科學計算、座標 |
| DOUBLE / REAL | 8 Bytes | ±2.22e-308 ~ ±1.79e308 | — | 雙精度科學計算 |
| DECIMAL(M,D) / NUMERIC | M+2 Bytes (D<M) 約每 9 位數 4 Bytes | 精確定點數,最大 65 位數 | — | 金額、價格、比率 (必須精確) |
| BIT(M) | 約 (M+7)/8 Bytes | 位元向量 | — | 權限位圖、特徵向量 |
日期時間類型
| 類型 | 空間 | 範圍 | 精度 | 時區感知 | 備註 |
| DATE | 3 Bytes | 1000-01-01 ~ 9999-12-31 | 天 | 否 | 生日、截止日 |
| TIME | 3 Bytes + 小數 | -838:59:59 ~ 838:59:59 | 秒/微秒 | 否 | 持續時間、工時 |
| YEAR | 1 Byte | 1901 ~ 2155 | 年 | 否 | 年份欄位 |
| DATETIME | 8 Bytes | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 秒/微秒 | 否 | 業務時間、建立時間 |
| TIMESTAMP | 4 Bytes | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 秒/微秒 | 是 | 自動更新、跨時區系統 |
關鍵差異:TIMESTAMP 儲存為 UTC,讀取時轉換為會話時區;DATETIME 字面儲存,不隨時區變化。5.6.4+ 兩者皆支援微秒精度 (fsp 0-6)。
字串與二進位類型
| 類型 | 最大長度 | 儲存開銷 | 字符集支援 | 適用場景 |
| CHAR(M) | 255 字符 | M × 字符集最大字節數 (固定) | 是 | 定長代碼 (ISO 國家碼、MD5 雜湊) |
| VARCHAR(M) | 65,535 字符 (共享 64KB 行上限) | L + 1/2 字節 (L=實際長度) | 是 | 變長文字、姓名、標題 |
| TINYTEXT | 255 字符 | L + 1 字節 | 是 | 極短文本 |
| TEXT | 64 KB | L + 2 字節 | 是 | 文章、描述 |
| MEDIUMTEXT | 16 MB | L + 3 字節 | 是 | 長文檔 |
| LONGTEXT | 4 GB | L + 4 字節 | 是 | 巨大文本、JSON 文檔 |
| BINARY(M) | 255 字節 | M 字節 (固定) | 否 (二進位) | 固定長二進位 (UUID、雜湊) |
| VARBINARY(M) | 65,535 字節 | L + 1/2 字節 | 否 | 變長二進位 (加密資料、圖片縮圖) |
| TINYBLOB ~ LONGBLOB | 同 TEXT 階層 | 同 TEXT | 否 | 二進位大物件 (檔案、圖片) |
| ENUM('v1','v2',...) | 65,535 個值 | 1-2 字節 (視值數量) | 是 | 固定集合狀態 (性別、訂單狀態) |
| SET('v1','v2',...) | 64 個成員 | 1/2/3/4/8 字節 | 是 | 多選標籤、權限組合 |
選型決策樹
- 是否為金額/精確小數? →
DECIMAL(19,4) 或 DECIMAL(precision, scale)
- 是否需時區轉換/自動更新? →
TIMESTAMP (注意 2038 年問題);否 → DATETIME(6)
- 長度固定且極短? →
CHAR / BINARY
- 長度可變、需索引? →
VARCHAR / VARBINARY (長度 ≤ 767 字節可建單欄索引,InnoDB 預設)
- 超長文本/二進位? →
TEXT/BLOB 階層,**避免 SELECT ***,單獨查詢
- 固定枚舉值? →
ENUM (單選) / SET (多選),比 VARCHAR 節省空間且隱含驗證
- 主鍵/外鍵? →
BIGINT UNSIGNED AUTO_INCREMENT (分散式用 UUID/GUID 存 BINARY(16) 或 CHAR(36))
InnoDB 行儲存限制補充
- 單行最大 65,535 字節 (含所有欄位開銷),
TEXT/BLOB 只存 20 字節指標在本地頁面,實際資料存溢出頁
VARCHAR(65535) 實際最大長度取決於字符集:utf8mb4 約 16,383 字符 (65535/4 - 1~2 字節長度前綴)
- 行溢出閾值:
innodb_page_size (預設 16KB) 的 1/2 ≈ 8KB,超過即移至溢出頁
效能與空間優化實戰
-- 1. 將 TINYINT(1) 布爾欄位改為 BIT(1) 節省 7 個位元 (但應用層處理較麻煩)
-- 2. 郵遞區號、手機號碼用 CHAR(5)/CHAR(11) 而非 VARCHAR
-- 3. 刪除未用索引:每個索引約佔 1 倍資料大小
-- 4. 使用 COMPRESSED 行格式 (ROW_FORMAT=COMPRESSED, KEY_BLOCK_SIZE=8) 壓縮 TEXT/BLOB
-- 5. 定期 OPTIMIZE TABLE 回收碎片空間 (僅 InnoDB file_per_table=ON 有效)