[SQL 스터디] BINARY로 영어 대소문자 구분하기
대부분의 SQL 데이터베이스에서는 대소문자 구분을 하지 않습니다. 테이블과 칼럼명뿐만 아니라 쿼리 내에서 조건으로 사용되는 문자열 또한 대소문자의 구분이 없는데요, 이 부분을 간단하게 알아보겠습니다.
기본 설정
id | name | |
0 | 1 | meeseeks |
1 | 2 | Meeseeks |
2 | 3 | MEEseekS |
Tistory 데이터베이스의 User 테이블이 있고, name에는 문자열 값들이 있습니다. 데이터베이스는 영여의 대소문자를 구분하지 않으므로, 이 세 값을 모두 같다고 판단합니다.
SELECT *
FROM User
WHERE name = "meeseeks";
>>> id name
1 meeseeks
2 Meeseeks
3 MEEseekS
따라서 위 쿼리를 실행하면 우리가 원하는 값과 달리 세 개 행 모두를 반환합니다.
BINARY 사용법
SELECT *
FROM User
WHERE BINARY name = "meeseeks";
>>> id name
1 meeseeks
대소문자를 구분하고 싶은 칼럼명 앞에 BINARY를 사용하여 대소문자 구분을 강제할 수 있습니다.
BINARY의 원리
BINARY를 사용하기 전 일반 문자열 데이터는 일반적으로 utf8_general_ci과 같은 Collation을 따릅니다.
- 여기서 Collation은 데이터베이스가 "문자열을 정렬하고 비교하는 규칙"입니다.
- utf8_general_ci = UTF-8 인코딩 + general한 정렬규칙 + 대소문자 구분 하지 않음 (case insensitive)
이 규칙에 따라 문자열을 비교하는 경우, WHERE 절 조건의 meeseeks와 데이터에 있는 meeseeks, Meeseeks, MEEseekS는 같은 문자열이 됩니다. Collation 설정을 바꾸어 대소문자를 구분하는 방법도 있지만, 쿼리에서 BINARY를 사용하는 방법이 가장 간단할 수 있습니다.
BINARY는 이러한 Collation을 무시하고 데이터를 바이너리 표현, 즉 이진 값으로 변환하여 비교합니다. 바이너리 표현에서 M과 N은 각각 01001101, 01101101로 다른 문자가 되기 때문에 구분이 가능해집니다.
JSON 필드 타입
JSON 데이터 타입의 칼럼은 대소문자를 구분합니다.
이는 데이터가 문자열이 아닌 "대소문자 구분을 엄격히 적용하는" JSON데이터로 저장되기 때문입니다.
당연한 내용일 수 있지만, 겉보기엔 같은 텍스트 데이터로 보이기에 헷갈릴 수 있습니다. 유의하면 좋을 것 같습니다!