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

MySQL 문자열 비교: 대소문자 구분 여부와 관계없이 수행되는 비교 방식

MySQL은 기본 설정에서 문자열을 비교할 때 대소문자를 구분하는(case-sensitive) 비교를 수행하지 않습니다. 이는 사용된 문자셋의 콜레이션(collation)이 대소문자를 구분하지 않는 방식(예: utf8mb4_general_ci)으로 설정되어 있기 때문입니다. 따라서 'Gaurav'와 'gaurav'처럼 철자만 다른 문자열은 MySQL이 동일한 값으로 취급합니다.

아래와 같은 데이터를 가진 'Employee' 테이블을 통해 이를 확인해 보겠습니다.

mysql> Select * from Employee;
+----+--------+--------+
| ID | Name   | Salary |
+----+--------+--------+
| 1  | Gaurav | 50000  |
| 2  | Rahul  | 20000  |
| 3  | Advik  | 25000  |
| 4  | Aarav  | 65000  |
| 5  | Ram    | 20000  |
| 6  | Mohan  | 30000  |
| 7  | Aryan  | NULL   |
| 8  | Vinay  | NULL   |
+----+--------+--------+
8 rows in set (0.09 sec)

대소문자가 무시되는 비교 결과

다음 쿼리는 WHERE 절의 IN 연산자에 소문자 'gaurav'와 대문자 'RAM'을 조건으로 지정했습니다. 그런데도 실제 테이블에 저장된 'Gaurav'와 'Ram' 행이 그대로 조회됩니다.

mysql> Select * from Employee WHERE Name IN ('gaurav','RAM');
+----+--------+--------+
| ID | Name   | Salary |
+----+--------+--------+
| 1  | Gaurav | 50000  |
| 5  | Ram    | 20000  |
+----+--------+--------+
2 rows in set (0.00 sec)

결과 집합을 보면 검색 조건의 대소문자와 저장된 값의 대소문자가 달라도 정상적으로 매칭되는 것을 알 수 있습니다. 이것이 바로 MySQL이 문자열 비교 시 대소문자를 구분하지 않음을 보여주는 예시입니다.

대소문자를 구분하여 비교하고 싶다면?

반대로 대소문자를 엄격하게 구분해야 하는 경우에는 다음과 같은 방법을 사용할 수 있습니다.

  • BINARY 키워드 사용: WHERE BINARY Name = 'gaurav' 처럼 조건에 BINARY를 붙이면 바이트 단위로 비교하여 대소문자를 구분합니다.
  • COLLATE 지정: WHERE Name = 'gaurav' COLLATE utf8mb4_bin 처럼 대소문자를 구분하는 바이너리 콜레이션을 명시적으로 지정할 수 있습니다.

정리하면, MySQL의 기본 문자열 비교는 대소문자 구분 여부와 관계없이 동일하게 처리되며, 필요에 따라 BINARY 또는 COLLATE 옵션을 통해 대소문자를 구분하는 비교로 전환할 수 있습니다.