數據類型選型直接影響儲存空間、索引效能、查詢精度與應用邏輯正確性。本文針對 MySQL 5.5+ 版本,深度剖析字符串(CHAR/VARCHAR/ENUM)、整數家族、浮點/定點數的選型原則與常見誤區。
| 特性 | CHAR(M) | VARCHAR(M) |
|---|---|---|
| 儲存方式 | 固定 M 字符,不足右補空格 | 實際長度 + 1/2 字節長度前綴 |
| 最大長度 | 0~255 字符 | 0~65,535 字符(受行大小 65,535 字節限制) |
| 截斷行為 | 嚴格模式:尾部空格截斷警告;非嚴格:靜默截斷 | 同左 |
| 索引效能 | 固定長度,比較/排序快 | 變長,需額外讀取長度前綴 |
| 適用場景 | 長度固定/近似固定(MD5、UUID、手機號、身份證、學號) | 長度變化大(姓名、地址、描述、JSON 片段) |
MySQL 單行上限 65,535 字節。UTF8MB4 下單字符最多 4 字節,故 VARCHAR(65535) 會報錯 Column length too big,實際上限約 16383。實測:
CREATE TABLE t (c VARCHAR(65535)) CHARSET=utf8mb4; -- Error 1074
CREATE TABLE t (c VARCHAR(16383)) CHARSET=utf8mb4; -- OK
CREATE TABLE country (
place ENUM('Japan','China','Russia','Brazil','America')
);
INSERT INTO country VALUES ('China'); -- 實際儲存 1 字節索引值 2
''(索引 0);'1','2','3'),MySQL 內部易混淆導致不可預期結果;| 類型 | 字節 | 有符號範圍 | 無符號範圍 | 典型用途 |
|---|---|---|---|---|
| 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 | 中等計數、IPv4 存儲 |
| INT / INTEGER | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 通用主鍵、外鍵、計數器 |
| BIGINT | 8 | -9.22E18 ~ 9.22E18 | 0 ~ 1.84E19 | 海量主鍵、時間戳毫秒、雪花算法 ID |
UNSIGNED 將負數空間轉給正數,範圍翻倍;ZEROFILL 自動補 0 顯示(如 INT(5) ZEROFILL 插入 42 顯示 00042),不影響儲存;INT(11) 中的 11 僅為顯示寬度提示,**不限制儲存範圍**。FLOAT:4 字節,單精度,約 7 位有效數字;DOUBLE:8 字節,雙精度,約 15 位有效數字;FLOAT(M,D)、DOUBLE(M,D),M=總位數,D=小數位;SELECT 0.1 + 0.2 = 0.3 為 FALSE。DECIMAL(M,D):M 最大 65,D 最大 30;TINYINT/SMALLINT/INT/BIGINT + UNSIGNED;DECIMAL(M,D);DOUBLE;CHAR;VARCHAR + 合理長度上限;ENUM 或 TINYINT + 應用層常量映射。