選擇合適的數據類型是資料庫設計的基石,直接影響存儲效率、查詢性能與數據完整性。本文系統整理 MySQL 常用數據類型的特點、適用場景與實戰示例。
| 類型 | 大小 | 範圍(有符號) | 適用場景 |
|---|---|---|---|
| TINYINT | 1 字節 | -128 ~ 127 | 布爾標誌、極小整數 |
| SMALLINT | 2 字節 | -32,768 ~ 32,767 | 較小範圍整數 |
| MEDIUMINT | 3 字節 | -8,388,608 ~ 8,388,607 | 中等範圍整數 |
| INT / INTEGER | 4 字節 | -2,147,483,648 ~ 2,147,483,647 | 通用整數、主鍵 ID |
| BIGINT | 8 字節 | -9.22e18 ~ 9.22e18 | 極大整數、分佈式 ID |
CREATE TABLE data_int (
fti TINYINT,
fsi SMALLINT,
fmi MEDIUMINT,
fi INT,
fbi BIGINT
);
INT(7) 中的 7 僅影響顯示寬度(配合 ZEROFILL 時零填充),不限制存儲範圍。存儲範圍始終由類型本身決定。
| 類型 | 大小 | 精度 | 適用場景 |
|---|---|---|---|
| FLOAT(M,D) | 4 字節 | 單精度(約 7 位有效數字) | 科學計算、近似值 |
| DOUBLE(M,D) | 8 字節 | 雙精度(約 15 位有效數字) | 高精度近似值 |
| DECIMAL(M,D) | M+2 字節 | 精確定點數 | 財務金額、精確計算 |
CREATE TABLE data_price (price FLOAT(5,2));
INSERT INTO data_price VALUES (13.1), (14.567);
SELECT * FROM data_price;
-- 結果:13.10, 14.57(四捨五入保留兩位小數)
注意:財務系統務必使用 DECIMAL 避免浮點誤差。
| 類型 | 最大長度 | 存儲特點 | 適用場景 |
|---|---|---|---|
| CHAR(M) | 255 字符 | 固定長度,不足右補空格 | 定長代碼、MD5、UUID |
| VARCHAR(M) | 65,535 字節 | 變長,實際長度+1/2 字節 | 通用變長字符串 |
| TEXT | 64 KB | 大文本,存儲在表外 | 文章內容、描述 |
| LONGTEXT | 4 GB | 超大文本 | 完整文檔、日誌 |
CREATE TABLE data_char (sname CHAR(10));
INSERT INTO data_char VALUES ('wers'), ('ertdsasdfggh');
SELECT *, LENGTH(sname) FROM data_char;
-- 'wers' 存儲為 'wers '(長度 10)
-- 'ertdsasdfggh' 截斷為 'ertdsasdfg'(長度 10)
| 類型 | 大小 | 範圍 | 特點 |
|---|---|---|---|
| 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 年問題限制 |
| YEAR | 1 字節 | 1901 ~ 2155 | 僅年份 |
CREATE TABLE data_date (birthday DATE);
INSERT INTO data_date VALUES ('2015-03-05'), (20150506);
SELECT * FROM data_date;
-- 均正確存儲為 2015-03-05 和 2015-05-06
CREATE TABLE data_enum (gender ENUM('M','F'));
INSERT INTO data_enum VALUES ('M'), ('m'), ('f'), ('yy'), (NULL);
SELECT * FROM data_enum;
-- 結果:'M', 'M', 'F', ''(空字符串), NULL
-- 注意:不區分大小寫,非法值存為空字符串(非 NULL)
統計查詢:SELECT COUNT(*) FROM data_enum WHERE gender = 'M';
CREATE TABLE data_set (hobbies SET('read','music','sport'));
INSERT INTO data_set VALUES ('read,music'), ('sport');
-- 可存儲多個枚舉值的組合
INT 或 BIGINT 作主鍵;狀態標誌用 TINYINT。DECIMAL(10,2) 或 DECIMAL(19,4)。CHAR,變長用 VARCHAR,大文本用 TEXT 族。TIMESTAMP,歷史/未來日期用 DATETIME。ENUM,需組合用 SET。