MySQL의 구분자


165

사람들이 구분 기호를 사용하는 경우가 종종 있습니다. 나는 구분자가 무엇인지, 그들의 목적이 무엇인지 알아 내려고 노력했다. 인터넷 검색 20 분 후, 나는 나를 만족시키는 답변을 찾지 못했습니다. 그래서 내 질문은 지금입니다 : 구분 기호는 무엇이며 언제 사용해야합니까?

답변:


245

디폴트 이외의 분리 문자 ;는 일반적으로 함수, 스토어드 프로 시저 및 트리거를 정의 할 때 사용되며 여러 명령문을 정의해야합니다. $$전체 프로 시저의 끝을 정의하는 데 사용되는 것과 같은 다른 분리 문자 를 정의하지만 그 내부에서 개별 명령문은 각각으로 종료됩니다 ;. 이렇게하면 mysql클라이언트 에서 코드가 실행될 때 클라이언트는 내부에서 개별 명령문을 실행하지 않고 전체 프로 시저가 끝나는 위치를 말하고이를 단위로 실행할 수 있습니다.

점을 유의 DELIMITER키워드는 명령 줄의 함수이다mysql 클라이언트 (및 다른 클라이언트) 만이 아닌 일반 MySQL의 언어 기능. 프로그래밍 언어 API를 통해 MySQL로 전달하려고 시도하면 작동하지 않습니다. PHPMyAdmin과 같은 일부 다른 클라이언트에는 기본이 아닌 구분자를 지정하는 다른 방법이 있습니다.

예:

DELIMITER $$
/* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */
DROP PROCEDURE my_procedure$$

/* Now start the procedure code */
CREATE PROCEDURE my_procedure ()
BEGIN    
  /* Inside the procedure, individual statements terminate with ; */
  CREATE TABLE tablea (
     col1 INT,
     col2 INT
  );

  INSERT INTO tablea
    SELECT * FROM table1;

  CREATE TABLE tableb (
     col1 INT,
     col2 INT
  );
  INSERT INTO tableb
    SELECT * FROM table2;
  
/* whole procedure ends with the custom delimiter */
END$$

/* Finally, reset the delimiter to the default ; */
DELIMITER ;

DELIMITER지원하지 않는 클라이언트와 함께 사용하려고 하면 서버로 전송되어 구문 오류가보고됩니다. 예를 들어, PHP 및 MySQLi 사용 :

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('DELIMITER $$');
echo $mysqli->error;

다음과 관련된 오류 :

SQL 구문에 오류가 있습니다. 1 행의 'DELIMITER $$'근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오.


3
구분자를 사용하는 것이 적합한 시나리오는 무엇입니까? 나는 그것을 정말로 얻지 못했다.
System.Data

2
@ System.Data 저장 프로 시저, 사용자 정의 함수 및 트리거를 정의 할 때 내 대답의 첫 번째 문장. MySQL 명령 행에서 여러 명령문이 단위로 실행될 때마다.
Michael Berkowski

2
DELIMITER 명령은 PhpMyAdmin SQL (적어도 일부 버전)에서는 작동하지 않습니다. 대신 별도의 필드에서 구분 기호를 SQL 자체로 설정할 수 있습니다. 이것은 꽤 오랫동안 혼란스러워했습니다 ... :-)
매우 불규칙한

1
@MichaelBerkowski, 앞으로 우리는 그것을 할 수있는 방법을 얻게 되길 바랍니다.
Pacerier

1
@StockB이 답변은 실제로 저장 프로 시저가 유용한 이유에 대한 것이 아니 었습니다. "한 단위"라는 언급은 MySQL이 SP를 구문 분석 할 때 SP를 해석 할 수있는 방법을 나타냅니다. 구분 기호로 단위 경계를 찾은 다음 내부에서 개별 명령문을 구문 분석하십시오. 그러나 요청한 이후 다중 문 SP를 사용하면 SP를 호출하는 응용 프로그램에서 구현 세부 정보를 숨길 수 있습니다. 응용 프로그램 코드는 일관된 결과를 반환하는 한 실행되는 SQL에 관심을 가질 필요가 없으며 필요한 경우 변경할 수 있습니다. 코드의 함수와 같습니다.
마이클 베르 코프 스키

21

DELIMITER 문은 세미콜론 (;) 인 표준 분리 문자를 다른 분리 문자로 변경합니다. 구분자는 세미콜론 (;)에서 이중 슬래시 //로 변경됩니다.

분리 문자를 변경해야하는 이유는 무엇입니까?

우리는 스토어드 프로 시저, 커스텀 함수 등을 전체적으로 서버에 전달하기를 원하기 때문에 mysql 도구가 한 번에 각 명령문을 해석하게하지 않습니다.


13

BEGIN...END블록 이있는 스토어드 루틴을 작성 하면 블록 내의 명령문은 세미콜론으로 종료됩니다 (;). 그러나 CREATE PROCEDURE성명서에도 종결자가 필요합니다. 따라서 루틴 본문 내의 세미콜론이 종료되는지 여부가 모호해집니다.CREATE PROCEDURE 이 프로 시저 본문 내의 명령문 중 하나를 종료하거나 종료 .

모호성을 해결하는 방법은 MySQL 클라이언트가 서버의 실제 종료 자로 인식하는 고유 한 문자열 (프로 시저 본문 내에는 안 됨)을 선언하는 것입니다. CREATE PROCEDURE 명령문 입니다.


1
DELIMITER를 가장 간단한 방법으로 사용해야하는 이유를 혼동하지 않으면 서 가장 좋은 대답입니다. 감사합니다
Fakhar 안와르


5

명령문, 함수, 저장 프로 시저 또는 트리거를 전체 명령문으로 처리하도록 mysql 클라이언트에 알리도록 DELIMITER를 정의합니다. 일반적으로 .sql 파일에서는 $$와 같은 다른 DELIMITER를 설정합니다. DELIMITER 명령은 MySQL 명령의 표준 구분 기호 (예 :;)를 변경하는 데 사용됩니다. 루틴 (함수, 저장 프로 시저 또는 트리거) 내의 명령문은 세미콜론 (;)으로 끝나므로 DELIMITER를 복합 명령문으로 취급합니다. 동일한 파일 또는 명령 행에서 다른 루틴을 사용할 때 정의되지 않으면 구문 오류가 발생합니다.

예약되지 않은 다양한 문자를 사용하여 사용자 지정 구분 기호를 만들 수 있습니다. 백 슬래시 (\) 문자는 MySQL의 이스케이프 문자이므로 사용하지 않아야합니다.

DELIMITER는 실제로 MySQL 언어 명령이 아니며 클라이언트 명령입니다.

DELIMITER $$

/*This is treated as a single statement as it ends with $$ */
DROP PROCEDURE IF EXISTS `get_count_for_department`$$

/*This routine is a compound statement. It ends with $$ to let the mysql client know to execute it as a single statement.*/ 
CREATE DEFINER=`student`@`localhost` PROCEDURE `get_count_for_department`(IN the_department VARCHAR(64), OUT the_count INT)
BEGIN
    
    SELECT COUNT(*) INTO the_count FROM employees where department=the_department;

END$$

/*DELIMITER is set to it's default*/
DELIMITER ;

mysql 프로 시저 코드의 범위를 정의하기 위해 구분자를 추가 할 수 있습니다. 자세한 내용은 내 튜토리얼 techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh

1

DELIMITER는 명령문, 함수, 저장 프로 시저 또는 트리거를 전체 명령문으로 처리하도록 mysql 클라이언트에 지시합니다. 일반적으로 sql 파일 $$와 같은 다른 DELIMITER를 설정했습니다. DELIMITER 명령은 MySQL 명령의 표준 구분 기호를 변경하는 데 사용됩니다


1

분리 문자는 데이터베이스에서 데이터 항목을 분리하는 데 사용되는 SQL의 문자입니다. 문자열의 시작과 끝을 식별합니다. 일반적으로 SQL에 사용되는 분리 문자는 ';'입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.