MySQL에서 CHARACTER SET과 COLLATION차이 정리

유경록·2025년 3월 30일

데이터베이스

목록 보기
3/5
post-thumbnail

🔤 MySQL에서 CHARACTER SETCOLLATION 차이 완전 정리

MySQL을 쓸 때 꼭 한 번은 마주치는 charsetcollation의 개념.
이 둘은 텍스트 데이터를 저장하고 처리하는 데 중요한 역할을 해여.


📌 개념 한 줄 요약

항목설명
CHARACTER SET텍스트를 어떻게 저장할지 (인코딩 방식)
COLLATION텍스트를 어떻게 비교/정렬할지 (정렬 규칙)

🧱 CHARACTER SET이란?

👉 텍스트 데이터를 저장할 때 사용하는 문자 인코딩 방식

  • 데이터베이스, 테이블, 컬럼 단위로 설정 가능
  • 예: utf8, latin1, ascii, utf8mb4

📦 주요 Character Set 예시

이름설명
utf8최대 3바이트 인코딩, 대부분 언어 지원 (단, 일부 이모지 저장 불가)
utf8mb4최대 4바이트 인코딩, 모든 유니코드 문자 지원 (이모지 포함)
latin1ISO-8859-1, 서유럽 언어 전용 (1바이트)
ascii7비트 ASCII, 영어만 표현 가능 (1바이트)

❓ UTF-8 vs UTF-8mb4

항목UTF-8UTF-8mb4
최대 바이트3바이트4바이트
이모지 지원❌ 불가✅ 가능
추천 용도간단한 영어/한글모든 유니코드 문자, 이모지 포함

💡 MySQL의 utf8은 표준 UTF-8과 다르다!
실제로는 최대 3바이트만 지원해 이모지, 일부 한자 등을 저장 못더라구요.
→ 그래서 보통은 utf8mb4를 써야 안전!


🔍 COLLATION이란?

👉 텍스트 데이터를 비교하고 정렬하는 규칙

  • 같은 문자셋이라도 비교 방식은 다를 수 있음
  • 예: 대소문자 구분 여부, 언어별 정렬 방식 등

🗂 주요 Collation 예시

이름설명
utf8_general_ci대소문자 구분 ❌, 빠른 일반적 비교 (ci: case-insensitive)
utf8_bin대소문자 구분 ✅, 이진 비교 (ASCII 코드값 비교)
utf8_unicode_ci대소문자 구분 ❌, 유니코드 표준을 따름 (언어별 정렬 정확도 ↑)

🔁 ci = Case Insensitive, cs = Case Sensitive, bin = Binary


🎯 실무에서 어떻게 쓰면 좋을까?

  • 글자 깨짐, 이모지 저장 오류를 피하려면 → utf8mb4 사용
  • 한국어, 이모지, 다양한 언어가 포함된 서비스라면 거의 필수
  • 정렬/검색에서 대소문자 구분이 필요 없다면 → utf8mb4_general_ci
  • 보안 민감한 비교나 해시, 로그인 비교 → utf8mb4_bin 추천

🧪 실전 예시

CREATE DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;


ALTER TABLE users
MODIFY COLUMN nickname VARCHAR(50)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

배운점!

처음에는 단순히 문자 인코딩 차이겠지 생각했지만,
실제로는 데이터 저장의 안전성과 검색/비교 정확도에 큰 영향을 준다는 걸 알게 됐다...
특히 이모지나 다국어를 지원하는 서비스에서는
utf8mb4 + 적절한 collation이 필수라는 걸 깨달았다!

profile
작은 문제도 끝까지 파고들며, 꾸준히 성장하는 백엔드 개발자를 지향합니다.

0개의 댓글