MySQL에서 문자열을 비교할 때 기본 콜레이션(collation)은 대소문자를 구분하지 않습니다. 예를 들어 utf8mb4_general_ci나 utf8_general_ci처럼 이름 끝에 _ci(case insensitive)가 붙은 콜레이션은 'MySQL'과 'mysql'을 같은 값으로 취급합니다.
이럴 때 COLLATE 절과 바이너리 콜레이션인 utf8_bin을 함께 사용하면 대소문자까지 완전히 일치하는 정확한 문자열만 조회할 수 있습니다. 실제 예제를 통해 확인해 보겠습니다.
1. 테이블 생성
먼저 예제로 사용할 테이블을 생성합니다.
mysql> create table DemoTable1620
-> (
-> Subject varchar(20)
-> );
Query OK, 0 rows affected (0.42 sec)
2. 샘플 데이터 삽입
대소문자가 서로 다른 여러 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1620 values('mysql');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1620 values('MySql');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1620 values('mYSQL');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1620 values('MySQL');
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable1620 values('MYSQL');
Query OK, 1 row affected (0.20 sec)3. 전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1620;
실행 결과는 다음과 같습니다.
+---------+
| Subject |
+---------+
| mysql |
| MySql |
| mYSQL |
| MySQL |
| MYSQL |
+---------+
5 rows in set (0.00 sec)
4. COLLATE를 사용한 정확한 문자열 검색
이제 COLLATE utf8_bin을 적용해 'MySQL'과 완전히 동일한 값만 검색해 보겠습니다.
mysql> select * from DemoTable1620 where Subject collate utf8_bin = 'MySQL';
실행 결과는 다음과 같습니다.
+---------+
| Subject |
+---------+
| MySQL |
+---------+
1 row in set (0.00 sec)
정리
위 결과에서 볼 수 있듯이, WHERE 조건에 COLLATE utf8_bin을 지정하면 대소문자가 정확히 일치하는 'MySQL' 한 건만 반환됩니다. 이 방법은 컬럼 정의를 변경하지 않고도 특정 쿼리에서만 대소문자를 구분한 비교를 수행할 수 있어 매우 유용합니다. 참고로 MySQL 8.0부터는 utf8mb4_bin 콜레이션을 사용하는 것이 권장됩니다.