MySQL에서 열 값 중 특수 문자가 포함된 데이터만 골라내야 할 때는 REGEXP 연산자를 활용하면 됩니다. REGEXP는 정규 표현식 기반으로 조건을 지정할 수 있어서, 알파벳과 숫자를 제외한 나머지 문자가 들어 있는 행을 손쉽게 필터링할 수 있습니다. 이번 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable(SubjectCode varchar(100)); Query OK, 0 rows affected (0.89 sec)
2. 샘플 데이터 입력하기
INSERT 문을 이용해 텍스트, 숫자, 특수 문자가 섞여 있는 레코드를 여러 개 입력합니다.
mysql> insert into DemoTable values('Java899@22');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('C#');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('~Python232');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('MongoDB%');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('C123456');
Query OK, 1 row affected (0.37 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+ | SubjectCode | +-------------+ | Java899@22 | | C# | | ~Python232 | | MongoDB% | | C123456 | +-------------+ 5 rows in set (0.00 sec)
4. 특수 문자가 포함된 값만 조회하기
특수 문자가 포함된 값을 가져오는 핵심 쿼리는 다음과 같습니다.
mysql> select *from DemoTable where SubjectCode regexp '[^a-zA-Z0-9\&]';
여기서 정규 표현식 [^a-zA-Z0-9\&]의 의미를 살펴보면, 대괄호 안의 ^는 부정(NOT)을 뜻합니다. 즉, 영문 대소문자(a-z, A-Z), 숫자(0-9), 그리고 & 기호를 제외한 어떤 문자라도 포함되어 있으면 매칭하겠다는 뜻입니다.
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+-------------+ | SubjectCode | +-------------+ | Java899@22 | | C# | | ~Python232 | | MongoDB% | +-------------+ 4 rows in set (0.00 sec)
결과 분석
결과를 보면 '@', '#', '~', '%' 같은 특수 문자가 포함된 4개의 행만 반환되었고, 오직 숫자로만 구성된 'C123456'은 결과에서 제외된 것을 확인할 수 있습니다. 이처럼 REGEXP의 부정 문자 클래스를 활용하면 원하는 패턴의 데이터만 정확하게 추출할 수 있습니다.
참고 사항
검색 대상에서 특정 특수 문자(예: '&')를 허용하고 싶다면 위 예제처럼 문자 클래스 안에 해당 문자를 명시하면 되고, 반대로 더 엄격한 필터링이 필요하다면 패턴을 상황에 맞게 수정하면 됩니다. 또한 MySQL 8.0부터는 ICU 라이브러리 기반의 정규 표현식이 적용되어 유니코드 처리도 더욱 안정적으로 지원됩니다.