MySQL의 VARCHAR 컬럼은 Collation 설정에 따라 대소문자를 구분하거나 구분하지 않는다.
의도치 않은 중복 저장 또는 조회 누락을 방지하려면 적절한 Collation 설정이 필요하다.
Goal
- MySQL의 VARCHAR 컬럼 설정시 주의할 인코딩 방식에 대해서 알아봅니다.
선결론
- MySQL의
VARCHAR
컬럼은Collation
설정에 따라 대소문자를 구분할 수도 있고, 구분하지 않을 수도 있다. - 의도한 동작을 위해선 단순히
CHARSET
만이 아니라,COLLATE
까지 명시적으로 설정해야 한다.
상세내용
- 규칙 (MySQL 공통):
_ci
: case-insensitive (대소문자 구분 없음)_cs
: case-sensitive (대소문자 구분)_bin
: binary 비교 (바이트 단위 비교)
-
보통 디폴트값은
_ci
이다. (예: MySQL 8.0의 기본값은utf8mb4_0900_ai_ci
) 인점에 주의 해야한다. DOCS _ci
일 때:- 저장된 값이
'ABCD'
일 경우'abcd'
를 추가하면 중복 저장 에러 발생 'aBCD'
로 조회해도'ABCD'
가 검색됨
- 저장된 값이
1 |
|
추가 정보: _cs
vs _bin
차이 및 실무 설정 팁
항목 | _cs (Case Sensitive) |
_bin (Binary) |
---|---|---|
비교 방식 | 문자 단위 비교 | 바이트 단위 비교 |
예시 | a ≠ A , ü = ü |
a ≠ A , ü ≠ ü |
정렬 | 언어 규칙 기반 정렬 | ASCII 기준 정렬 |
주 용도 | 대소문자만 구분 필요할 때 | 완전한 바이트 일치 필요할 때 |
장단점 | 사람이 보기 쉬운 정렬 | 정렬 비직관적이지만 성능 우수 |
실무 추천:
- 기본 조회용 필드 →
_ci
- 로그인 ID, 토큰 등 정확한 매칭 필드 →
_cs
또는_bin
1 |
|
Conclusion
VARCHAR
컬럼에서 대소문자 구분을 명확히 하고 싶다면 반드시COLLATE
속성을 의도에 맞게 설정해야 한다.- 특히 로그인 ID나 고유값 비교, 해시값 컬럼 등은 기본값인
_ci
로 설정할 경우, 예상치 못한 중복 허용 또는 조회 결과 오류가 발생할 수 있다. - 실무에서는 기본값은
_ci
, 정밀 비교에는_cs
또는_bin
전략을 추천한다.