MySQL Client 預設以分號 ; 判斷 SQL 語句結束。但在建立 Trigger、Stored Procedure、Function 等包含多條語句、內部含分號的物件時,若不變更結束符,Client 會在第一個分號處提交執行,導致語法錯誤或邏輯截斷。
-- 1. 變更結束符為 $$
DELIMITER $$
-- 2. 撰寫包含分號的完整邏輯
CREATE TRIGGER update_ego_price_on_delete
AFTER DELETE ON customer_info
FOR EACH ROW
BEGIN
DELETE FROM ego_price WHERE customer_id = OLD.customer_id;
END$$
-- 3. 恢復預設結束符
DELIMITER ;
mysql> DELIMITER //
mysql> CREATE FUNCTION SHORTEN(s VARCHAR(255), n INT)
-> RETURNS VARCHAR(255)
-> BEGIN
-> IF ISNULL(s) THEN RETURN ''; END IF;
-> IF n < 15 THEN RETURN LEFT(s, n); END IF;
-> IF CHAR_LENGTH(s) <= n THEN RETURN s; END IF;
-> RETURN CONCAT(LEFT(s, n-10), '...', RIGHT(s, 5));
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> SELECT SHORTEN('這是一個很長的測試字串用來驗證截斷功能', 20);
+------------------------------------------------------------------+
| SHORTEN('這是一個很長的測試字串用來驗證截斷功能', 20) |
+------------------------------------------------------------------+
| 這是一個很長的測...驗證截斷功能 |
+------------------------------------------------------------------+
//:最常用,簡短不易衝突。$$:mysqldump 輸出常用,視覺明確。||、##:亦可,避開業務 SQL 內容。原則:選擇不會出現在函數/觸發器本體內的字串。
DELIMITER 字串,判定為一條完整語句。DELIMITER 僅影響 Client 端解析行為,**不會儲存到伺服器、不影響 Binlog、不影響其他 Client**。| 工具 | DELIMITER 支援 | 備註 |
|---|---|---|
| mysql 命令列 | 完整支援 | 標準用法 |
| MySQL Workbench | 支援 | 腳本區塊自動識別 |
| Navicat / DBeaver | 支援 | 可在工具選項設定預設分隔符 |
| JDBC / 程式碼驅動 | **不支援** | 需在應用層手動分割語句或使用單一語句 |
DELIMITER 是 MySQL Client 端的「語句邊界標記切換器」。掌握「改符 → 寫邏輯 → 改回」三步曲,即可在命令列、腳本檔順利建立複雜程式物件。記得結束務必改回 ;,避免後續一般查詢誤判。