; 結束\G 替代分號 (僅限 mysql 客戶端)| 型別 | 說明 | 注意事項 | |
|---|---|---|---|
| TEXT | 非標準型別,實為 LONG VARCHAR / MEDIUMTEXT | 用 VARCHAR(65535) 或對應 TEXT 系列 | |
| DATE | 格式 YYYY-MM-DD | PHP 產生:date('Y-m-d');可直接相減得天數差 | |
| SET | 可儲存多個預定值 (最多 64 個) | 超過 64 個需拆多欄位;ENUM 單值最多 65535 個 | |
| ENUM | 單值選擇 | NOT NULL 時預設為第一個值 |
| 符號 | 用途 | 搭配 | 範例 |
|---|---|---|---|
% | 匹配任意長度字串 (含空字串) | LIKE | WHERE name LIKE '張%' |
_ | 匹配單一字元 | LIKE | WHERE code LIKE 'A__' |
* | 選取所有欄位 | SELECT | SELECT * FROM t |
註:% 僅能搭配 LIKE 使用,不可單獨用於 =。
-- 插入不指定欄位
INSERT INTO t (col1) VALUES ('a'); -- col2 預設 NULL
-- 定義 NOT NULL
ALTER TABLE t MODIFY col2 VARCHAR(10) NOT NULL; -- 插入時若不給值會報錯
-- ENUM NOT NULL 預設第一個值
CREATE TABLE t (status ENUM('a','b') NOT NULL);
INSERT INTO t () VALUES (); -- status = 'a'
-- 查詢差異
SELECT * FROM t WHERE col = ''; -- 找到空字串,找不到 NULL
SELECT * FROM t WHERE col IS NULL; -- 找到 NULL,找不到空字串
SELECT * FROM t WHERE col LIKE '%'; -- 找到空字串,找不到 NULL
prepare('SELECT * FROM users WHERE city LIKE ? OR city IS NULL');
$stmt->execute([$city]);
// 或在資料庫層面預設空字串
ALTER TABLE users MODIFY city VARCHAR(50) NOT NULL DEFAULT '';
對已有資料的表新增欄位,舊列新欄位值可能為 NULL 或空字串 (視版本/引擎),導致查詢不一致。解法:
NOT NULL DEFAULT ''ADD COLUMN ... NULL → UPDATE SET col='' → MODIFY NOT NULLOR col IS NULL 防禦filter_var、ctype_*、正則DateTimeImmutable、資料庫存 DATE/DATETIMESELECT *,明確列出欄位INSERT ... VALUES (...),(...),...