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

SQL에서 WHERE 절과 함께 BINARY 키워드 사용하는 방법

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 속성을 추가하면 해당 컬럼의 모든 비교가 항상 대소문자를 구분합니다.