| 類型 | 空間 | 無符號最大值 | 適用場景 |
|---|---|---|---|
TINYINT |
1 Byte | 255 | 狀態碼、布林旗標、極小範圍計數 |
SMALLINT |
2 Bytes | 65,535 | 中小範圍計數、年齡、權重 |
MEDIUMINT |
3 Bytes | 16,777,215 | 中等 ID、自增主鍵(< 1600 萬行) |
INT |
4 Bytes | 4,294,967,295 | 通用主鍵、外鍵、大多數計數 |
BIGINT |
8 Bytes | 18,446,744,073,709,551,615 | 極大 ID、分散式 ID、時間戳毫秒 |
策略:選擇「剛好夠用」的最小類型。1000 萬行表,主鍵用 MEDIUMINT 替代 INT 可節省 ~10MB 索引空間,提升快取命中率。
DECIMAL(precision, scale),如 DECIMAL(10,2)。| 類型 | 空間 | 精度 | 最小正值 |
|---|---|---|---|
FLOAT |
4 Bytes | ~7 位有效數字 | 1.17E-38 |
DOUBLE |
8 Bytes | ~15 位有效數字 | 2.22E-308 |
適用:科學測量、座標、物理模擬。民用系統極少用到。
| 類型 | 空間 | 範圍 | 精度 | 適用場景 |
|---|---|---|---|---|
DATE |
3 Bytes | 1000-01-01 ~ 9999-12-31 | 天 | 生日、入職日期、訂單日期 |
TIME |
3 Bytes | -838:59:59 ~ 838:59:59 | 秒 | 每日排班、營業時間、耗時 |
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 | 秒 | 記錄建立/修改時間(自動更新)、跨時區系統 |
YEAR |
1 Byte | 1901 ~ 2155 | 年 | 年份欄位 |
關鍵差異:TIMESTAMP 會自動轉換時區(儲存 UTC、讀取時按會話時區轉換),DATETIME 不轉換。跨時區應用優先 TIMESTAMP;單一時區業務用 DATETIME 避免時區困擾。
| 特性 | CHAR(n) | VARCHAR(n) |
|---|---|---|
| 儲存方式 | 固定長度,不足右補空格 | 可變長度,實際長度 + 1~2 Bytes 長度前綴 |
| 空間計算 | 固定 n Bytes(字符集字節數) | 實際字節數 + 1 Byte (≤255) / 2 Bytes (>255) |
| 速度 | 略快(固定位移) | 略慢(需讀長度) |
| 適用 | 長度固定/近似固定(MD5、UUID、手機號、身分證、郵編、股票代碼) | 長度變動大(姓名、地址、描述、標題) |
決策邏輯:若實際長度接近定義長度(如股票名稱多為 4 字 = 8 Bytes),用 CHAR 更省空間(省去長度前綴);若變動大,用 VARCHAR。
| 類型 | 最大長度 | 長度前綴 | 適用 |
|---|---|---|---|
TINYTEXT |
255 Bytes | 1 Byte | 極短備註 |
TEXT |
64 KB | 2 Bytes | 文章內容、商品描述 |
MEDIUMTEXT |
16 MB | 3 Bytes | 長文、日誌 |
LONGTEXT |
4 GB | 4 Bytes | 極大文本、完整 HTML 頁面 |
最佳實踐:大文本拆分到獨立表(垂直分表),主表只存核心欄位,避免大欄位拖慢主表掃描、降低緩衝池效率。
| 類型 | 成員上限 | 選擇方式 | 空間 | 適用 |
|---|---|---|---|---|
ENUM |
65,535 | 單選(必選一) | 1~2 Bytes | 性別、狀態、優先級、省份 |
SET |
64 | 多選(0~多個) | 1~8 Bytes | 標籤、權限位掩碼、多屬性 |
-- 性別:只有兩種,1 Byte 極致省空間且語義清晰
gender ENUM('帥哥', '美眉') NOT NULL DEFAULT '帥哥'
-- 訂單狀態:有限狀態機
status ENUM('pending', 'paid', 'shipped', 'completed', 'cancelled') NOT NULL DEFAULT 'pending'
-- 文章標籤:多選
tags SET('tech', 'life', 'travel', 'food', 'sport') DEFAULT ''
優勢:比 TINYINT 更具可讀性,直接存取字串值,應用層無需映射字典。
BIGINT UNSIGNED AUTO_INCREMENT(分散式用 Snowflake ID)。NOT NULL,必要時才允許 NULL(NULL 需額外位圖空間、索引統計複雜)。DEFAULT,避免應用層未傳值報錯。DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci。VARCHAR(191) 以下可建完整索引(utf8mb4 下 767 Bytes 限制),超長用前綴索引或 Hash 索引。