DB/MySQL

[MySQL] Delimiter 사용법

프로호구래머 2020. 9. 16. 21:56

우선, 영어로 delimiter는 구분자를 의미한다.

그러므로 MySQL에서는 구분자를 변경하기 위해 delimiter 명령어를 사용한다.

mysql에서 구분자를 디폴트로 세미콜론(;)을 문장 구분자로 이용한다.

select * from hogu;


Each stored program(Trigger나 Procedure을 의미하는 듯 하다.)은 body에 SQL문을 포함할 수 있다.
포함된 SQL문은 세미콜론(;)으로 나뉘어진 여러 문장들로 구성된 복합문 일수도 있다.

 

만약 delimiter를 재정의하지 않은 예시이다.

CREATE PROCEDURE `hogu`()
BEGIN
	declare i int default 1;
    
    while i <= 500 do
		set i = i + 1;
	end while;
END;

이렇게 stored program을 선언하게 되면 delimiter가 세미콜론이므로

1) CREATE PROCEDURE `hogu`() BEGIN declare i int default 1;
2) while i <= 500 do set i = i + 1;
3) end while;
4) END;

이렇게 4개의 문장으로 구분되어서 서버로 보내질 것이다.

그렇다면 서버는 당연히 해당 문장들을 이해하지 못할 것이다.


그래서 stored program의 정의를 서버로 보내기 위해서는 delimiter를 일시적으로 재정의 해주어야만 한다.

이때, mysql delimiter를 재정의 하기위해 사용하는 것이 DELIMITER 명령어이다.

 

아래는 DELIMITER를 사용한 예시이다.

DELIMITER $$

CREATE PROCEDURE `hogu`()
BEGIN
	declare i int default 1;
    
    while i <= 500 do
		set i = i + 1;
	end while;
END$$

DELIMITER ;

이렇게 되면 서버에는 stored program의 정의 전체가 한 번에 보내어 질 것이다.


그리고, 주의해야 할 점은 DELIMITER를 재정의하고 stored program을 정의한 후에 delimiter를 기존의 세미콜론(;)으로 바꿔주는 것이 좋을 것이다. (계속해서 DELIMITER를 사용자가 재정의한 것으로 사용할게 아니라면...)

또한, 사용자가 DELIMITER를 어떤 문자나 문자열을 한글자 혹은 여러글자로 구성해서 선언할 수도 있지만 backslash(\)만큼은 피해야만 한다. 왜나하면 backslash는 MySQL에서 escape문이기 때문이다.

만약 stored program 내부에 semicolon이 사용되지 않는다면 불필요하게 DELIMETER를 사용하지 않아도 된다.

 


출처

https://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html

 

MySQL :: MySQL 8.0 Reference Manual :: 24.1 Defining Stored Programs

24.1 Defining Stored Programs Each stored program contains a body that consists of an SQL statement. This statement may be a compound statement made up of several statements separated by semicolon (;) characters. For example, the following stored procedur

dev.mysql.com

'DB > MySQL' 카테고리의 다른 글

[MySQL] ERROR 1833  (0) 2021.04.09
페이징 테스트(procedure 이용)  (0) 2020.09.16
mysql error 2003  (2) 2020.09.15
datetime vs timestamp  (0) 2020.09.07