TEXT 類型澄清
TEXT 不是獨立資料類型,而是 LONG VARCHAR 或 MEDIUMTEXT 的別名。MySQL 實際支援四種文本類型:
| 類型 | 最大長度 | 儲存開銷 |
| TINYTEXT | 255 字元 | 長度 + 1 位元組 |
| TEXT | 65,535 字元 (64 KB) | 長度 + 2 位元組 |
| MEDIUMTEXT | 16,777,215 字元 (16 MB) | 長度 + 3 位元組 |
| LONGTEXT | 4,294,967,295 字元 (4 GB) | 長度 + 4 位元組 |
DATE 日期類型
- 格式:
YYYY-MM-DD (如 1999-12-08)。
- PHP 取得當前日期:
date("Y-m-d")。
- 日期減法:兩個 DATE 相減直接得天數差 (MySQL 自動轉型)。
SELECT DATEDIFF('2024-01-10', '2024-01-01'); -- 回傳 9
SELECT '2024-01-10' - '2024-01-01'; -- 同樣回傳 9 (隱含轉型)
SET 集合類型 vs ENUM 列舉類型
| 特性 | ENUM | SET |
| 值的數量 | 單選 (僅一個) | 多選 (零到多個) |
| 預定義值上限 | 65,535 個 | 64 個 |
| 儲存方式 | 1~2 位元組 (索引值) | 1~8 位元組 (位元遮罩) |
| 適用場景 | 互斥狀態 (性別、狀態機) | 標籤、多重屬性 (技能、興趣) |
SET 超過 64 個值怎麼辦?
拆分為多個 SET 欄位,或改用關聯表 (正規化設計):
-- 方案 A: 多 SET 欄位
skills_set1 SET('php','mysql','linux',...), -- 前 64 項
skills_set2 SET('python','docker','k8s',...), -- 後 64 項
-- 方案 B: 關聯表 (推薦,可擴充、可索引、可統計)
CREATE TABLE user_skills (user_id INT, skill VARCHAR(50), PRIMARY KEY(user_id, skill));
SQL 通配符完整說明
| 通配符 | 用途 | 配合關鍵字 | 範例 |
* | 選取所有欄位 | SELECT | SELECT * FROM users |
% | 匹配任意長度字串 (含 0 字元) | LIKE | WHERE name LIKE 'A%' |
_ | 匹配**單一**任意字元 | LIKE | WHERE code LIKE 'A_C' (匹配 ABC, AXC...) |
關鍵差異
* 用於 欄位清單 (SELECT 子句)。
%、_ 用於 字串值比對 (WHERE 子句),必須搭配 LIKE。
實用範例
-- 找出姓「王」且名為兩個字的用戶
SELECT * FROM users WHERE name LIKE '王__';
-- 找出 email 以 gmail.com 結尾
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- 找出代碼格式為 A-數字-B (如 A-1-B, A-9-B)
SELECT * FROM products WHERE code LIKE 'A-_B';
效能提醒
LIKE 'xxx%' (前綴固定) 可使用索引,LIKE '%xxx' 或 LIKE '%xxx%' 會全表掃描。
- 大量模糊搜尋建議使用 全文索引 (FULLTEXT) 或外部搜尋引擎 (Elasticsearch)。