MySQL에서 예약어(reserved word)를 테이블 이름이나 컬럼 이름처럼 식별자(identifier)로 사용하려면 반드시 따옴표로 감싸야 합니다. 이때 사용할 수 있는 따옴표의 종류는 ANSI_QUOTES SQL 모드의 설정 여부에 따라 달라집니다.
1. ANSI_QUOTES 모드가 비활성화된 경우
기본적으로 ANSI_QUOTES 모드가 비활성화되어 있으면 식별자 감쌀 때 사용하는 따옴표 문자는 백틱(`)뿐입니다. 아래는 'select'라는 예약어를 테이블 이름으로 사용하는 예제입니다.
mysql> create table `select`(id int); Query OK, 0 rows affected (0.19 sec)
백틱으로 감싸주었기 때문에 예약어인 'select'를 문제없이 테이블 이름으로 사용할 수 있습니다.
2. ANSI_QUOTES 모드가 활성화된 경우
ANSI_QUOTES 모드를 활성화하면 백틱(`)과 큰따옴표("")를 모두 식별자 따옴표 문자로 사용할 수 있습니다. 아래는 'trigger'라는 예약어를 테이블 이름으로 사용하는 과정을 보여주는 예제입니다.
mysql> Create table "trigger" (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 '"trigger" (id int)' at line 1 mysql> Set sql_mode = 'ANSI_Quotes'; Query OK, 0 rows affected (0.03 sec) mysql> Create table "trigger" (id int); Query OK, 0 rows affected (0.17 sec) mysql> Create table `DESCRIBE`(id int); Query OK, 0 rows affected (0.11 sec)
실행 결과 분석
위 예제의 흐름을 살펴보면 다음과 같습니다.
- 모드 변경 전에는 큰따옴표로 감싼
"trigger"테이블 생성 시도가 1064 구문 오류와 함께 실패했습니다. SET sql_mode = 'ANSI_Quotes';명령으로 모드를 활성화한 후에는 동일한 쿼리가 정상적으로 실행되었습니다.- 동시에 백틱으로 감싼
`DESCRIBE`테이블도 여전히 잘 생성되는 것을 확인할 수 있습니다.
즉, ANSI_QUOTES 모드를 활성화하면 백틱(`)과 큰따옴표("") 두 가지를 모두 식별자 따옴표 문자로 사용할 수 있습니다.
참고 사항
SET sql_mode로 변경한 설정은 현재 세션에만 적용되며 서버 재시작 시 초기화될 수 있습니다. 영구적으로 적용하려면 MySQL 설정 파일(my.cnf 또는 my.ini)의 sql-mode 옵션에 ANSI_QUOTES를 추가하거나, SET GLOBAL sql_mode를 사용하면 됩니다.
다만 예약어를 식별자로 사용하면 쿼리 작성 시 매번 따옴표를 입력해야 하는 번거로움이 있고 실수로 인한 오류 가능성도 높아지므로, 가급적 예약어와 겹치지 않는 이름을 사용하는 것이 좋습니다.