IGNORE_SPACE SQL 모드는 MySQL 파서가 공백(whitespace)에 민감한 함수 이름을 어떻게 해석할지 결정하는 설정입니다. 함수 이름과 괄호 사이의 공백 여부에 따라 해당 이름이 함수 호출로 인식될지, 아니면 식별자(identifier)로 인식될지가 달라집니다.
IGNORE_SPACE SQL 모드는 크게 두 가지 상황에서 그 동작이 구분되며, 각각의 경우를 살펴보겠습니다.
Case 1: IGNORE_SPACE SQL 모드가 비활성화된 경우
이 모드가 비활성화되어 있으면, 함수 이름과 그 뒤에 오는 괄호 사이에 공백이 없을 때 파서는 해당 이름을 함수 호출로 해석합니다. 주목할 점은 함수 이름이 표현식(expression)이 아닌 문맥에서 사용되더라도 같은 방식으로 해석된다는 것입니다.
예를 들어, 내장 함수인 SUM과 동일한 이름으로 테이블을 생성하려고 하면 다음과 같은 구문 오류가 발생합니다.
mysql> CREATE TABLE SUM(Id INT);
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the
right syntax to use near 'SUM(Id Int)' at line 1
이 오류를 해결하고 이름을 일반 식별자로 인식시키려면 두 가지 방법을 사용할 수 있습니다. 첫째, 이름과 괄호 사이에 공백을 추가하거나, 둘째, 이름을 따옴표로 감싸는 것입니다. 아래 문장들은 모두 정상적으로 실행됩니다.
CREATE TABLE SUM (id INT);
CREATE TABLE `SUM`(id INT);
CREATE TABLE `SUM` (id INT);
Case 2: IGNORE_SPACE SQL 모드가 활성화된 경우
이 모드를 활성화하면, 파서는 함수 이름과 괄호 사이에 공백이 없어야 한다는 요구 조건을 완화합니다. 따라서 IGNORE_SPACE SQL 모드가 켜져 있으면 아래 두 함수 호출은 모두 유효합니다.
SELECT SUM(Salary) FROM employee;
SELECT SUM (Salary) FROM employee;
다만 이 경우에는 한 가지 중요한 대가가 따릅니다. 파서가 함수 이름을 예약어(reserved word)로 취급하기 때문에, 함수 이름 뒤에 공백이 있어도 더 이상 그 이름을 테이블명이나 컬럼명 같은 식별자로 사용할 수 없습니다.
정리
- 비활성화 시: 함수 이름 뒤 공백이 없으면 함수 호출로 해석되며, 식별자로 쓰려면 공백 추가 또는 따옴표(``) 사용 필요
- 활성화 시: 함수 이름과 괄호 사이 공백 허용, 단 함수 이름이 예약어처럼 취급되어 식별자로 사용 불가