SQL에서 BINARY 키워드는 WHERE 절 뒤에 사용하여 값이 대소문자까지 정확히 일치하는지 비교할 수 있습니다. 기본적으로 MySQL은 문자열을 비교할 때 대소문자를 구분하지 않지만, BINARY 키워드를 사용하면 대소문자를 엄격하게 구분하는 비교가 가능합니다.
사례 1: 대소문자를 구분하지 않는 기본 비교
먼저 일반적인 문자열 비교가 어떻게 동작하는지 살펴보겠습니다. 다음 쿼리를 실행해 보세요.
mysql> select 'joHN'='JOHN' as Result;
실행 결과는 다음과 같습니다.
+--------+ | Result | +--------+ | 1 | +--------+ 1 row in set (0.00 sec)
위 결과에서 값이 1(true)로 반환되었습니다. 그러나 'joHN'과 'JOHN'은 분명 다른 문자열입니다. 즉, 기본 설정에서는 대소문자를 구분하지 않고 비교한다는 것을 알 수 있습니다.
사례 2: BINARY 키워드로 대소문자 구분 비교
대소문자까지 정확하게 일치하는지 확인하려면 BINARY 키워드를 사용하면 됩니다.
mysql> select binary 'joHN'='JOHN' as Result;
실행 결과는 다음과 같습니다.
+--------+ | Result | +--------+ | 0 | +--------+ 1 row in set (0.00 sec)
이번에는 두 문자열이 다르다고 판단하여 0(false)이 반환되었습니다. 이번에는 완전히 동일한 문자열을 비교해 보겠습니다.
mysql> select binary 'JOHN'='JOHN' as Result;
실행 결과는 다음과 같습니다.
+--------+ | Result | +--------+ | 1 | +--------+ 1 row in set (0.00 sec)
동일한 문자열끼리는 BINARY 키워드를 사용해도 1(true)이 반환됩니다.
테이블 생성 시 컬럼 자체를 대소문자 구분으로 만들기
BINARY 키워드는 쿼리에서만 사용할 수 있는 것이 아니라, 테이블을 생성할 때 특정 컬럼에 적용하여 해당 컬럼을 항상 대소문자를 구분하도록 설정할 수도 있습니다.
실제로 확인해 보기 위해 테이블을 하나 생성해 보겠습니다.
mysql> create table binaryKeywordDemo -> ( -> Id int NOT NULL AUTO_INCREMENT, -> Name varchar(10) binary, -> PRIMARY KEY(Id) -> ); Query OK, 0 rows affected (0.88 sec)
Name 컬럼에 binary 속성이 지정된 것을 볼 수 있습니다. 이제 INSERT 명령으로 여러 개의 레코드를 삽입합니다.
mysql> insert into binaryKeywordDemo(Name) values('bOB');
Query OK, 1 row affected (0.15 sec)
mysql> insert into binaryKeywordDemo(Name) values('bob');
Query OK, 1 row affected (0.13 sec)
mysql> insert into binaryKeywordDemo(Name) values('BOB');
Query OK, 1 row affected (0.18 sec)
mysql> insert into binaryKeywordDemo(Name) values('Bob');
Query OK, 1 row affected (0.18 sec)
mysql> insert into binaryKeywordDemo(Name) values('bOb');
Query OK, 1 row affected (0.15 sec)
mysql> insert into binaryKeywordDemo(Name) values('boB');
Query OK, 1 row affected (0.21 sec)SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from binaryKeywordDemo;
실행 결과는 다음과 같습니다.
+----+------+ | Id | Name | +----+------+ | 1 | bOB | | 2 | bob | | 3 | BOB | | 4 | Bob | | 5 | bOb | | 6 | boB | +----+------+ 6 rows in set (0.00 sec)
대소문자 조합이 서로 다른 6개의 레코드가 저장되어 있습니다. 이제 'Bob'과 정확히 일치하는(대소문자 구분) 레코드만 조회해 보겠습니다.
mysql> select *from binaryKeywordDemo where Name='Bob';
실행 결과는 다음과 같습니다.
+----+------+ | Id | Name | +----+------+ | 4 | Bob | +----+------+ 1 row in set (0.00 sec)
컬럼에 binary 속성이 적용되어 있기 때문에 'bob', 'BOB', 'bOB' 등 다른 조합의 레코드는 제외되고, 'Bob'과 정확히 일치하는 단 하나의 레코드만 반환되었습니다.
정리
- MySQL의 기본 문자열 비교는 대소문자를 구분하지 않습니다.
- WHERE 절에서
binary키워드를 사용하면 해당 비교 연산이 대소문자를 구분하게 됩니다. - 테이블 생성 시 컬럼 정의에
binary속성을 추가하면 해당 컬럼의 모든 비교가 항상 대소문자를 구분합니다.