| 類型 | 存儲 | 有符號範圍 | 無符號範圍 |
|---|---|---|---|
| TINYINT | 1 字節 | -128~127 | 0~255 |
| SMALLINT | 2 字節 | -32768~32767 | 0~65535 |
| MEDIUMINT | 3 字節 | -8388608~8388607 | 0~16777215 |
| INT | 4 字節 | -2147483648~2147483647 | 0~4294967295 |
| BIGINT | 8 字節 | -2^63~2^63-1 | 0~2^64-1 |

顯示寬度 INT(6) 僅影響查詢結果填充,**不限制存儲範圍**。超範圍值會被截斷,非法值自動轉 0。
實例:年齡用 TINYINT UNSIGNED。
| 類型 | 精度 | 存儲 | 範圍 |
|---|---|---|---|
| FLOAT | 單精度 | 4 字節 | ±1.17E-38 ~ ±3.40E+38 |
| DOUBLE | 雙精度 | 8 字節 | ±2.22E-308 ~ ±1.79E+308 |
| DECIMAL(M,D) | 精確定點 | M+2 字節 | 取決於 M,D |

FLOAT(7,3) 顯示 7 位含 3 位小數,超範圍截斷,超精度四捨五入。
實測陷阱:FLOAT(5,3) 插入 123.45678 → 實存 99.999(溢出截斷)。
金額類**必須用 DECIMAL**,如薪資 FLOAT(8,2) UNSIGNED 或 DECIMAL(10,2)。
| 類型 | 存儲 | 範圍 | 格式 |
|---|---|---|---|
| DATE | 3 字節 | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD |
| TIME | 3 字節 | -838:59:59 ~ 838:59:59 | HH:MM:SS |
| YEAR | 1 字節 | 1901 ~ 2155 | YYYY |
| DATETIME | 8 字節 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS |
| TIMESTAMP | 4 字節 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS |

TIMESTAMP 未賦值或賦 NULL 自動填充當前時間,**注意 2038 年上限**。生日用 DATE。
| 類型 | 最大長度 | 特點 |
|---|---|---|
| CHAR(n) | 255 字符 | 定長,不足右補空格,存儲時尾部空格被截斷 |
| VARCHAR(n) | 65535 字符 | 變長,實際長度+1~2 字節,不截斷尾部空格 |
| TINYTEXT | 255 字符 | 不指定長度 |
| TEXT | 65535 字符 | 通用長文本 |
| MEDIUMTEXT | 16777215 字符 | 中等長文本 |
| LONGTEXT | 4294967295 字符 | 超長文本 |

關鍵差異:CHAR 固定空間適合定長高頻讀寫(如 MD5、UUID);VARCHAR 節省空間適合變長;超長度自動截斷;utf8 下 1 中文字符 = 3 字節。
ENUM('v1','v2',...):單選,最多 65535 個元素,內部用 1~2 字節整數存儲SET('v1','v2',...):多選,最多 64 元素,內部用位圖存儲性別用 ENUM('M','F'),標籤用 SET。
CREATE TABLE tb1 (
username VARCHAR(20),
age TINYINT UNSIGNED,
salary FLOAT(8,2) UNSIGNED,
birthday DATE
);
INSERT INTO tb1 VALUES('Tom', 22, 5555.55, '1994-10-01');

原則:更小通常更好、定長用 CHAR、變長用 VARCHAR、金額用 DECIMAL、時間按範圍選 DATE/TIMESTAMP/DATETIME。