개요
MySQL에서 IN() 조건과 함께 조회할 때 기본적으로 대소문자가 다르면 일치하지 않는 것으로 처리될 수 있습니다. 이럴 때 UPPER() 또는 LOWER() 함수를 활용하면 대소문자를 구분하지 않고 데이터를 조회할 수 있습니다.
이 글에서는 예제 테이블을 만들고, IN()과 UPPER()를 조합해 대소문자와 관계없이 원하는 레코드를 검색하는 방법을 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1460 -> ( -> Name varchar(20) -> ); Query OK, 0 rows affected (0.91 sec)
2단계: 데이터 삽입
INSERT 명령어를 사용해 테이블에 샘플 데이터를 추가합니다.
mysql> insert into DemoTable1460 values('Chris');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1460 values('David');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1460 values('Bob');
Query OK, 1 row affected (0.52 sec)
mysql> insert into DemoTable1460 values('Robert');
Query OK, 1 row affected (0.11 sec)3단계: 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1460;
위 쿼리는 다음과 같은 결과를 출력합니다.
+--------+ | Name | +--------+ | Chris | | David | | Bob | | Robert | +--------+ 4 rows in set (0.00 sec)
4단계: 대소문자를 구분하지 않는 SELECT 실행
핵심은 IN() 앞에 UPPER() 함수를 사용하는 것입니다. 컬럼 값과 비교할 문자열을 모두 대문자로 변환한 뒤 비교하기 때문에, 저장된 값이 'Chris'든 'CHRIS'든 동일하게 매칭됩니다.
mysql> select * from DemoTable1460 where UPPER(Name) IN('CHRIS','BOB');실행 결과는 다음과 같습니다.
+-------+ | Name | +-------+ | Chris | | Bob | +-------+ 2 rows in set (0.00 sec)
추가 팁
대소문자 변환은 LOWER()를 사용해 소문자 기준으로 통일할 수도 있습니다. 이 경우 컬럼 값과 비교값을 모두 소문자로 맞추면 됩니다.
select * from DemoTable1460 where LOWER(Name) IN('chris','bob');또한, MySQL의 기본 콜레이션(예: utf8mb4_general_ci) 중 일부는 이름 끝의 _ci(case insensitive)처럼 자체적으로 대소문자를 구분하지 않습니다. 이런 콜레이션을 사용 중이라면 별도의 함수 없이도 대소문자 무관 비교가 가능하지만, 대소문자를 엄격히 구분하는 콜레이션(_cs 또는 _bin) 환경에서는 위와 같이 UPPER()/LOWER() 방식이 유용합니다.