首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL DELIMITER 詳解:自定義語句結束符讓複雜邏輯順利執行

     編輯:MySQL 資料庫相關知識

為什麼需要 DELIMITER?

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 ;

互動式 Client 實操範例

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 內容。

原則:選擇不會出現在函數/觸發器本體內的字串。

原理深度解析

  1. Client 讀取輸入行,累積到緩衝區。
  2. 遇到當前 DELIMITER 字串,判定為一條完整語句。
  3. 發送給 Server 執行,Server 端不感知 Delimiter,只解析標準 SQL。
  4. DELIMITER 僅影響 Client 端解析行為,**不會儲存到伺服器、不影響 Binlog、不影響其他 Client**。

工具差異提醒

工具DELIMITER 支援備註
mysql 命令列完整支援標準用法
MySQL Workbench支援腳本區塊自動識別
Navicat / DBeaver支援可在工具選項設定預設分隔符
JDBC / 程式碼驅動**不支援**需在應用層手動分割語句或使用單一語句

總結

DELIMITER 是 MySQL Client 端的「語句邊界標記切換器」。掌握「改符 → 寫邏輯 → 改回」三步曲,即可在命令列、腳本檔順利建立複雜程式物件。記得結束務必改回 ;,避免後續一般查詢誤判。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved