Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL LIKE 와일드카드로 대소문자 구분 검색하기 – BINARY 키워드 활용법

MySQL의 기본 콜레이션(utf8mb4_general_ci 등)은 대소문자를 구분하지 않기 때문에, 일반적인 WHERE 조건이나 LIKE 검색에서는 'Bob', '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)

4. BINARY 키워드 문법

대소문자를 구분하여 문자열을 비교하는 기본 문법은 다음과 같습니다.

SELECT * FROM yourTableName WHERE BINARY column_name = 'value';

LIKE 와일드카드와 함께 사용할 때는 아래 형식을 사용합니다.

SELECT * FROM yourTableName WHERE BINARY column_name LIKE '패턴';

5. 대소문자 구분 비교 실행

정확히 소문자 'bob'과 일치하는 행만 조회해 보겠습니다.

mysql> SELECT * FROM InCaseSensDemo WHERE BINARY Name = 'bob';
+------+
| Name |
+------+
| bob  |
+------+
1 row in set (0.00 sec)

BINARY 없이 실행하면 'bob', 'BoB', 'Bob' 세 행이 모두 반환되지만, BINARY를 적용하면 완전히 동일한 'bob' 한 행만 결과로 나옵니다.

6. LIKE 와일드카드로 부분 일치 검색

% 와일드카드를 함께 사용하면 부분 일치 검색에서도 대소문자를 구분할 수 있습니다. 예를 들어 소문자 'o'가 포함된 이름만 찾는다면 다음과 같습니다.

mysql> SELECT * FROM InCaseSensDemo WHERE BINARY Name LIKE '%o%';
+------+
| Name |
+------+
| bob  |
| BoB  |
| Bob  |
+------+
3 rows in set (0.00 sec)

JOhN에는 대문자 O만 있고 소문자 o가 없기 때문에 결과에서 제외됩니다. 이처럼 BINARY와 LIKE를 조합하면 패턴 매칭 시에도 정확한 대소문자 필터링이 가능합니다.

참고: 다른 방법

BINARY 외에도 COLLATE 절에 바이너리 콜레이션(예: utf8mb4_bin)을 지정하는 방법이 있습니다. LOWER() 함수로 양쪽 값을 소문자로 변환해 비교할 수도 있지만, 이 경우 원본 데이터의 대소문자 정보가 사라지므로 정확한 대소문자 일치가 필요하다면 BINARY 또는 바이너리 콜레이션 사용을 권장합니다.