合理的數據類型選型是資料庫性能優化的基石,影響存儲空間、查詢速度、索引效率及應用邏輯正確性。本文系統梳理 MySQL 所有數據類型特性、存儲開銷、選型原則及常見陷阱。
| 類型 | 存儲字節 | 範圍 | 格式示例 | 適用場景 |
|---|---|---|---|---|
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 2024-01-15 | 生日、入職日期等純日期 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | 14:30:00 | 時間段、工時記錄 |
| DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 2024-01-15 14:30:00 | 業務時間、創建/更新時間 |
| TIMESTAMP | 4 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 2024-01-15 14:30:00 | 自動記錄修改時間、跨時區應用 |
| YEAR | 1 | 1901 ~ 2155 | 2024 | 年份存儲 |
關鍵差異:TIMESTAMP 存儲 UTC,讀取時按會話時區轉換;DATETIME 存儲原始值,不做時區轉換。2038 年問題限制 TIMESTAMP 長期使用。
| 類型 | 字節 | 有符號範圍 | 無符號範圍 | 典型用途 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 布爾值、狀態碼、小枚舉 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 年齡、小範圍計數 |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等範圍 ID、計數 |
| INT | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 主鍵 ID、通用計數器 |
| BIGINT | 8 | -9.22E18 ~ 9.22E18 | 0 ~ 1.84E19 | 大數據量主鍵、高精度計算 |
選型原則:夠用就好,越小越好。無符號可擴大正數範圍,但應用層需處理邊界。
| 類型 | 字節 | 精度 | 存儲方式 | 適用場景 |
|---|---|---|---|---|
| FLOAT(M,D) | 4 | 單精度 ~7 位有效數字 | 二進制近似值 | 科學計算、非精確測量值 |
| DOUBLE(M,D) | 8 | 雙精度 ~15 位有效數字 | 二進制近似值 | 高精度科學計算 |
| DECIMAL(M,D) | M+2 | 精確到 D 位小數 | 字符串存儲每位數字 | 金額、價格、精確計算 |
陷阱實驗:FLOAT(5,3) 插入 123.45678 實際存儲 99.999(超出範圍截斷)。金融、價格類絕對禁止使用 FLOAT/DOUBLE。
| 類型 | 長度特性 | 最大長度 | 存儲開銷 | 適用場景 |
|---|---|---|---|---|
| CHAR(N) | 固定長度 | 255 字符 | N 字符空間 | 定長代碼、MD5、UUID、國家代碼 |
| VARCHAR(N) | 可變長度 | 65,535 字符 | 實際長度 + 1-2 字節 | 通用變長字符串 |
| TINYTEXT | 可變長度 | 255 字符 | 實際長度 + 1 字節 | 極短文本 |
| TEXT | 可變長度 | 65,535 字符 | 實際長度 + 2 字節 | 文章、描述類文本 |
| MEDIUMTEXT | 可變長度 | 16,777,215 字符 | 實際長度 + 3 字節 | 長文本 |
| LONGTEXT | 可變長度 | 4,294,967,295 字符 | 實際長度 + 4 字節 | 超長文本、日誌 |
CHAR 尾部空格會被截斷,VARCHAR/TEXT 保留VARCHAR 需 1-2 字節記錄長度,TEXT 固定 2 字節CHAR/VARCHAR 可建立完整索引,TEXT 僅支持前綴索引CHAR(100) 佔 400 字節,VARCHAR(100) 實際佔用按內容| 類型 | 成員上限 | 存儲 | 特性 | 適用場景 |
|---|---|---|---|---|
| ENUM | 65,535 | 1-2 字節 | 單選、內部存儲為整數索引 | 狀態機、性別、固定分類 |
| SET | 64 | 1-8 字節 | 多選、位掩碼存儲 | 權限標籤、多屬性標記 |
注意:ENUM 成員順序即排序順序,修改成員需 ALTER TABLE 重建表。
| 屬性 | 作用 | 關鍵限制 | 典型用法 |
|---|---|---|---|
| AUTO_INCREMENT | 自增主鍵 | 唯一、整數類型、通常為主鍵 | id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY |
| BINARY | 區分大小寫比較 | 僅 CHAR/VARCHAR | code VARCHAR(20) BINARY |
| DEFAULT | 默認值 | 常量值、不可用函數/表達式 | status TINYINT DEFAULT 1 |
| INDEX/KEY | 普通索引 | 支持前綴長度 | INDEX idx_name (name(10)) |
| NOT NULL | 禁止 NULL | 插入必須提供值 | 業務必填字段 |
| NULL | 允許 NULL | 默認屬性 | 可選字段 |
| PRIMARY KEY | 主鍵約束 | 唯一、非空、單表僅一個 | PRIMARY KEY (id) |
| UNIQUE | 唯一約束 | 允許多個 NULL | email VARCHAR(100) UNIQUE |
| ZEROFILL | 零填充顯示 | 自動添加 UNSIGNED | order_id INT ZEROFILL 顯示 0000000001 |
-- 安全修改:兼容現有數據
ALTER TABLE tbl MODIFY col NEW_TYPE;
-- 風險操作:數據可能截斷/轉換失敗
ALTER TABLE tbl MODIFY col VARCHAR(10) NOT NULL;
原則:擴大類型安全,縮小類型需驗證數據兼容性;生產環境大表使用 pt-online-schema-change。
DECIMAL(10,2) 或 BIGINT 存分CHAR(11) 或 BIGINTCHAR(18)VARCHAR(100)TEXT / LONGTEXTTINYINT + 應用層常量 或 ENUMSET 或 關聯表(推薦)DATETIME 默認 CURRENT_TIMESTAMPDATETIME 默認 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP數據類型選型看似基礎,實則影響深遠。遵循「最小足夠、業務對齊、性能優先」原則,結合具體存儲引擎特性,才能構建高效穩健的資料庫模型。