데이터베이스 작업을 하다 보면 'Smith'와 'smith'처럼 대소문자만 다른 값들을 하나의 조건으로 검색해야 하는 경우가 자주 발생합니다. MySQL의 LOWER() 함수를 사용하면 이러한 문제를 간단하게 해결할 수 있습니다. 이번 글에서는 예제 테이블을 만들고, 대소문자에 관계없이 특정 성(Last Name)을 가진 레코드를 조회하는 방법을 단계별로 알아보겠습니다.
1. 테이블 생성하기
먼저 예제로 사용할 테이블을 생성합니다.
mysql> create table DemoTable623 (FirstName varchar(100), LastName varchar(100), Age int);
Query OK, 0 rows affected (0.76 sec)
2. 레코드 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다. 여기서는 의도적으로 대소문자가 다른 성('Smith'와 'smith', 'Brown'과 'brown')을 함께 넣었습니다.
mysql> insert into DemoTable623 values('John','Smith',23);
Query OK, 1 row affected (0.66 sec)
mysql> insert into DemoTable623 values('Adam','smith',23);
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable623 values('Chris','Brown',24);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable623 values('Robert','brown',21);
Query OK, 1 row affected (0.22 sec)3. 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 데이터를 조회해 보겠습니다.
mysql> select *from DemoTable623;
실행 결과는 다음과 같습니다.
+-----------+----------+------+
| FirstName | LastName | Age |
+-----------+----------+------+
| John | Smith | 23 |
| Adam | smith | 23 |
| Chris | Brown | 24 |
| Robert | brown | 21 |
+-----------+----------+------+
4 rows in set (0.00 sec)
4. LOWER() 함수로 대소문자 무시하고 검색하기
LOWER() 함수는 문자열을 모두 소문자로 변환해 줍니다. 따라서 WHERE 절에서 열 값에 LOWER()를 적용하고 소문자로 된 검색어와 비교하면, 원본 데이터의 대소문자와 상관없이 일치하는 모든 레코드를 찾을 수 있습니다.
mysql> select FirstName from DemoTable623 where lower(LastName)='smith';
위 쿼리의 실행 결과입니다. 'Smith'와 'smith' 두 레코드가 모두 반환된 것을 확인할 수 있습니다.
+-----------+
| FirstName |
+-----------+
| John |
| Adam |
+-----------+
2 rows in set (0.00 sec)
추가 팁: UPPER() 함수와 콜레이션 설정
반대로 UPPER() 함수를 사용해 모든 값을 대문자로 변환한 뒤 비교하는 방법도 가능합니다. 참고로 MySQL의 기본 콜레이션(예: utf8mb4_general_ci)은 이름 끝의 _ci(case insensitive)에서 알 수 있듯이 대소문자를 구분하지 않기 때문에, 일반적인 환경에서는 WHERE LastName = 'smith'만으로도 동일한 결과를 얻을 수 있습니다. 하지만 콜레이션이 _cs(case sensitive)로 설정되어 있다면, 위 예제처럼 LOWER() 함수를 반드시 활용해야 정확한 검색 결과를 얻을 수 있습니다.