MySQL은 기본적으로 문자열 비교 시 대소문자를 구분하지 않습니다. 따라서 'Bob'과 'bob'을 동일한 값으로 취급합니다. 하지만 실제 개발 환경에서는 대소문자까지 정확하게 일치하는 데이터만 조회해야 하는 경우가 종종 발생합니다. 이럴 때 BINARY 키워드를 활용하면 간단하게 해결할 수 있습니다.
1. 예제용 테이블 생성하기
먼저 CREATE 명령어를 사용하여 테스트용 테이블을 생성합니다.
mysql> CREATE table InCaseSensDemo
-> (
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.50 sec)
2. 샘플 데이터 삽입하기
INSERT 명령어를 사용하여 대소문자가 다양하게 조합된 레코드들을 테이블에 삽입합니다.
mysql> INSERT into InCaseSensDemo values('JOhN');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT into InCaseSensDemo values('bob');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT into InCaseSensDemo values('BoB');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT into InCaseSensDemo values('Bob');
Query OK, 1 row affected (0.18 sec)3. 저장된 전체 데이터 확인하기
SELECT 명령어로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> SELECT * from InCaseSensDemo;
실행 결과는 다음과 같습니다.
+------+
| Name |
+------+
| JOhN |
| bob |
| BoB |
| Bob |
+------+
4 rows in set (0.00 sec)
'bob', 'BoB', 'Bob'처럼 철자는 같지만 대소문자 조합이 서로 다른 값들이 함께 저장되어 있는 것을 확인할 수 있습니다.
4. BINARY 키워드로 대소문자 구분 비교하기
대소문자를 구분하여 문자열을 비교하려면 WHERE 절에서 BINARY 연산자를 사용합니다. 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName WHERE BINARY column_name = 'value';
BINARY 키워드는 문자열을 이진(binary) 값으로 변환하여 비교하기 때문에, 문자 하나하나의 대소문자까지 엄격하게 구분됩니다.
5. 실제 적용 예제
위 문법을 적용하여 정확히 'bob'과 일치하는(모두 소문자인) 레코드만 조회해 보겠습니다.
mysql> SELECT * FROM InCaseSensDemo WHERE BINARY Name = 'bob';
실행 결과는 다음과 같습니다.
+------+
| Name |
+------+
| bob |
+------+
1 row in set (0.00 sec)
결과를 보면 'BoB'나 'Bob'은 제외되고, 오직 소문자 'bob'과 정확히 일치하는 레코드 한 건만 반환된 것을 확인할 수 있습니다.
마무리 및 추가 팁
MySQL에서 대소문자 구분 비교가 필요할 때는 BINARY 연산자를 사용하면 됩니다. 다만 몇 가지 유의할 점이 있습니다.
첫째, 인덱스 성능 저하. BINARY를 사용하면 컬럼에 인덱스가 있더라도 제대로 활용되지 않아 대량의 데이터에서는 조회 속도가 느려질 수 있습니다.
둘째, 컬럼 정의 시 해결 가능. 컬럼을 생성할 때 처음부터 VARCHAR(100) BINARY처럼 선언하거나, COLLATE utf8mb4_bin과 같은 바이너리 콜레이션을 지정하면 별도의 BINARY 연산자 없이도 항상 대소문자를 구분하여 비교할 수 있습니다.
셋째, LIKE 절에서도 사용 가능. 부분 일치 검색 시에도 WHERE BINARY column_name LIKE '%bob%' 형태로 활용할 수 있습니다.
상황에 맞게 BINARY 연산자와 바이너리 콜레이션을 적절히 활용하시기 바랍니다.