MySQL에서 문자열에 대문자(A~Z)가 하나라도 포함된 레코드만 조회하고 싶다면, 정규 표현식 기반의 패턴 매칭 연산자인 RLIKE를 사용하면 됩니다. 다만 MySQL은 기본적으로 대소문자를 구분하지 않는(Case-insensitive) 비교를 수행하기 때문에, 단순히 RLIKE '[A-Z]'만 사용하면 소문자도 함께 매칭될 수 있습니다.
이 문제를 해결하려면 CAST(... AS BINARY)로 컬럼을 이진(binary) 형식으로 변환한 뒤 패턴 매칭을 적용해야 정확한 결과를 얻을 수 있습니다. 아래에서 예제와 함께 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 실습용 테이블을 만들어 보겠습니다.
mysql> CREATE TABLE contains_capital_letterDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (1.42 sec)
2. 테스트 데이터 삽입
대소문자가 섞인 이름 데이터를 몇 개 입력합니다.
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('Larry');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('larry');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('john');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('JOHN');
Query OK, 1 row affected (0.36 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('mike');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO contains_capital_letterDemo(Name) VALUES('Mike');
Query OK, 1 row affected (0.27 sec)
3. 전체 데이터 확인
SELECT 문으로 저장된 모든 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM contains_capital_letterDemo;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 1 | Larry | | 2 | larry | | 3 | john | | 4 | JOHN | | 5 | mike | | 6 | Mike | +----+-------+ 6 rows in set (0.00 sec)
4. 대문자가 포함된 필드만 조회하는 쿼리
핵심 쿼리입니다. CAST(Name AS BINARY)로 값을 이진 문자열로 변환한 후, RLIKE '[A-Z]' 패턴으로 대문자 존재 여부를 검사합니다.
mysql> SELECT * FROM contains_capital_letterDemo
WHERE CAST(Name AS BINARY) RLIKE '[A-Z]';
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 1 | Larry | | 4 | JOHN | | 6 | Mike | +----+-------+ 3 rows in set (0.00 sec)
결과 분석 및 핵심 포인트
- Larry, JOHN, Mike처럼 대문자가 하나라도 포함된 레코드만 반환되었습니다.
larry,john,mike처럼 완전히 소문자로만 구성된 값은 제외됩니다.CAST(컬럼명 AS BINARY)를 반드시 함께 사용하세요. 이진 변환 없이 실행하면 MySQL의 기본 콜레이션(case-insensitive) 특성 때문에 의도한 대소문자 구분이 되지 않습니다.- 참고로
RLIKE는REGEXP와 동일하게 동작하는 연산자이며, MySQL 8.0부터는 ICU(International Components for Unicode) 라이브러리 기반의 정규 표현식 엔진을 사용합니다.
마무리
이처럼 RLIKE와 BINARY 변환을 조합하면 대소문자 구분 검색을 간단하게 구현할 수 있습니다. 반대로 소문자만 포함된 필드를 찾으려면 RLIKE '^[a-z]+$' 같은 패턴을 응용하면 되며, 숫자나 특정 문자 조합 검색 등 다양한 조건에도 확장하여 활용할 수 있습니다.