數據類型決定存儲空間、計算效率、索引性能。本文系統梳理 MySQL 五大類型族、核心選型原則,並演示數據表全生命周期操作命令,助你建立「恰如其分」的表設計習慣。
| 類型 | 字節 | 有符號範圍 | 無符號範圍 | 典型場景 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 布爾、狀態碼、極小計數 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 小範圍計數 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 中等計數 |
| INT / INTEGER | 4 | -21億 ~ 21億 | 0 ~ 42億 | 通用 ID、計數器 |
| BIGINT | 8 | -922兆 ~ 922兆 | 0 ~ 1844兆 | 海量 ID、時間戳毫秒 |
原則:夠用就好,越小越好。節省存儲、緩存、索引深度、CPU 比較開銷。
| 類型 | 字節 | 精度 | 適用場景 |
|---|---|---|---|
| FLOAT | 4 | ~7 位有效數字 | 科學計算、非精確金額 |
| DOUBLE | 8 | ~15 位有效數字 | 高精度科學計算 |
| DECIMAL(M,D) | M+2 | 精確十進制 | 金融、價格、比率(必選) |
避坑:浮點類型存儲近似值,0.1 + 0.2 != 0.3。金額務必用 DECIMAL(10,2)。
| 類型 | 字節 | 範圍 | 特點 |
|---|---|---|---|
| YEAR | 1 | 1901~2155 | 僅年份 |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 日期 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | 時間/間隔 |
| DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 無時區,靜態時間點 |
| TIMESTAMP | 4 | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 帶時區自動轉換,受 2038 年問題限制 |
實戰建議:
BIGINT 毫秒時間戳(UTC),應用層轉換展示。DATETIME 避開 2038 年上限。updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。| 類型 | 長度範圍 | 存儲特性 | 適用場景 |
|---|---|---|---|
| CHAR(M) | 0~255 | 定長,右側空格填充 | 固定長度代碼:MD5、UUID、國標代碼 |
| VARCHAR(M) | 0~65535 | 變長,1-2 字節前綴 | 通用變長文本 |
| TINYTEXT | 255 | 溢出頁 | 極短文本 |
| TEXT | 64KB | 溢出頁 | 文章、描述 |
| MEDIUMTEXT | 16MB | 溢出頁 | 長文本 |
| LONGTEXT | 4GB | 溢出頁 | 巨大文本 |
| ENUM | 65535 | 內部存數字索引 | 固定集合:性別、狀態、類型 |
| SET | 64 | 位圖存儲 | 多選標籤 |
BINARY/VARBINARY、BLOB 族:存儲圖片、文件流、加密數據。不建議大文件入庫,存對象存儲路徑。
USE db_name; CREATE TABLE IF NOT EXISTS `users` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `username` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '用戶名', `email` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '郵箱', `password_hash` CHAR(64) NOT NULL DEFAULT '' COMMENT '密碼哈希', `status` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1正常 0禁用', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), KEY `idx_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';

SHOW TABLES; -- 當前庫所有表 SHOW TABLES FROM other_db; -- 指定庫 SHOW TABLES LIKE 'user%'; -- 模糊匹配

DESC users; -- 簡要 DESCRIBE users; -- 同 DESC SHOW CREATE TABLE users\G -- 完整 DDL(含引擎、字符集、索引、註釋)

-- 插入
INSERT INTO users(username, email, password_hash) VALUES('tom', 'tom@test.com', 'hash123');
INSERT INTO users(username, email, password_hash) VALUES('jerry', 'jerry@test.com', 'hash456'), ('spike', 'spike@test.com', 'hash789');
-- 查詢
SELECT * FROM users;
SELECT id, username FROM users WHERE status = 1 ORDER BY created_at DESC LIMIT 10;


NOT NULL:插入 NULL 報錯 Column 'col' cannot be null。DEFAULT:隱式插入時自動填充,配合 NOT NULL 保證數據完整性。| 業務需求 | 推薦類型 | 拒絕類型 |
|---|---|---|
| 自增主鍵 ID | BIGINT UNSIGNED | INT(未來擴容風險) |
| 金額/價格 | DECIMAL(10,2) | FLOAT/DOUBLE |
| 創建/更新時間 | DATETIME / TIMESTAMP | VARCHAR 存字符串 |
| 用戶名/郵箱 | VARCHAR(64/128) | CHAR/TEXT |
| 性別/狀態枚舉 | TINYINT / ENUM | VARCHAR |
| 標籤多選 | SET / JSON / 關聯表 | 逗號分隔 VARCHAR |
| MD5/UUID | CHAR(32/36) | VARCHAR |
「選對類型,是性能優化的起點;拒絕過度設計,是架構演進的智慧。」