MySQL에서 REGEXP(정규 표현식)를 사용할 때 괄호 ()는 특수 문자로 해석되기 때문에, 문자 그대로의 괄호를 검색하려면 별도의 처리가 필요합니다. 이 글에서는 REGEXP 절에서 괄호를 올바르게 다루고, 괄호가 포함된 특정 패턴의 값만 조회하는 방법을 예제와 함께 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1908
(
Code text
);
Query OK, 0 rows affected (0.00 sec)2. 샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다. 괄호가 포함된 데이터와 포함되지 않은 데이터를 섞어서 넣습니다.
mysql> insert into DemoTable1908 values('MySQL(1)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MongoDB 2 Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MySQL(3)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('SQL Server(10)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MySQL 8 Database');
Query OK, 1 row affected (0.00 sec)3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1908;
실행 결과는 다음과 같습니다.
+------------------------+ | Code | +------------------------+ | MySQL(1)Database | | MongoDB 2 Database | | MySQL(3)Database | | SQL Server(10)Database | | MySQL 8 Database | +------------------------+ 5 rows in set (0.00 sec)
4. REGEXP에서 괄호 처리하기 – 핵심 기법
정규 표현식에서 괄호는 그룹화(grouping)를 의미하는 메타 문자입니다. 따라서 일반적인 방법으로는 문자 그대로의 괄호를 매칭할 수 없습니다.
여기서 유용한 방법은 대괄호([]) 문자 클래스 안에 괄호를 넣는 것입니다. 대괄호 안에 있는 문자는 특별한 의미 없이 리터럴(문자 그대로)로 취급되기 때문에, [(]은 여는 괄호 (, [)]는 닫는 괄호 )와 정확히 일치하게 됩니다.
다음은 'MySQL(숫자)Database' 형태, 즉 괄호로 묶인 값을 가진 행만 조회하는 쿼리입니다.
mysql> select * from DemoTable1908 where Code regexp '^MySQL[(][0-9][)]Database';
실행 결과는 다음과 같습니다.
+------------------+ | Code | +------------------+ | MySQL(1)Database | | MySQL(3)Database | +------------------+ 2 rows in set (0.00 sec)
패턴 분석
^MySQL: 문자열이 'MySQL'로 시작하는지 확인합니다.[(]: 여는 괄호 '('를 문자 그대로 매칭합니다.[0-9]: 숫자 한 자리(0~9)와 일치합니다.[)]: 닫는 괄호 ')'를 문자 그대로 매칭합니다.Database: 뒤따라 오는 'Database' 문자열과 일치합니다.
그 결과, 괄호가 없는 'MySQL 8 Database'나 숫자가 두 자리인 'SQL Server(10)Database'는 제외되고, 정확히 'MySQL(숫자)Database' 패턴에 해당하는 두 개의 행만 반환됩니다.
마무리
MySQL REGEXP에서 괄호 같은 특수 문자를 검색할 때는 백슬래시(\(, \))로 이스케이프하는 방법도 있지만, 대괄호 문자 클래스([(], [)])를 활용하면 더 간결하고 명확하게 표현할 수 있습니다. 두 방법 모두 결과는 동일하므로 상황에 맞게 선택해서 사용하시면 됩니다.