메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL의 문자 집합은 문자열이 저장되는 방식(어떤 바이트가 어떤 문자를 나타내는지)을 제어합니다. 콜레이션은 문자열이 비교되고 정렬되는 방식을 제어합니다. 처음부터 이를 올바르게 설정하면 나중에 고치기 어려운 손상된 데이터와 잘못된 정렬을 피할 수 있습니다.

utf8mb4 — 올바른 기본값

항상 utf8mb4를 사용하세요. MySQL의 utf8(mb4가 없는)은 4바이트 유니코드 문자를 저장할 수 없는 3바이트 인코딩입니다 — 여기에는 이모지, 많은 한자, 다양한 기호가 포함됩니다. utf8mb4는 완전한 UTF-8 인코딩입니다.
utf8을 사용하는 레거시 데이터베이스를 쓰고 있다면, utf8mb4로 마이그레이션하려면 데이터베이스, 테이블, 컬럼을 변환해야 합니다.

문자 집합 빠른 참조

비용 열은 문자 집합 자체의 성능 비용이 아니라 나중에 잘못된 선택을 고치는 데 필요한 작업에 관한 것입니다. latin1이 함정입니다: 오류 없이 모든 바이트 값을 받아들이므로 잘못된 데이터가 조용히 들어오고, 표시하거나 변환하려 할 때에야 드러납니다.

콜레이션

콜레이션은 정렬 순서와 비교 동작을 결정합니다. 일반적인 선택: utf8mb4_0900_ai_ci는 기본 콜레이션이며 가장 좋은 범용 선택입니다. 유니코드를 올바르게 처리하고, 대소문자를 구분하지 않으며(ci), 악센트를 구분하지 않습니다(ai). 정확한 바이트 일치가 필요할 때만 utf8mb4_bin을 사용하세요. ci = 대소문자 구분 안 함, cs = 대소문자 구분, ai = 악센트 구분 안 함, as = 악센트 구분.

문자 집합 설정

데이터베이스 생성 시:
테이블 생성 시:
컬럼 수준(테이블 기본값 재정의):
컬럼 수준 문자 집합은 테이블의 나머지 부분은 대소문자를 구분하지 않으면서 한 컬럼만 대소문자를 구분하는 일치가 필요할 때 유용합니다. 컬럼의 문자 집합 변경:
테이블 전체 변환:
CONVERT TO는 한 문장으로 모든 컬럼을 변경합니다. 테이블을 재구축하므로 테이블 크기에 비례하는 시간이 걸립니다.

문자 집합 확인

SHOW CREATE TABLE 출력에서 문자 집합이 표시되지 않는 컬럼은 테이블 기본값을 상속하고 있는 것입니다.

연결 문자 집합

연결 문자 집합은 MySQL이 클라이언트로부터 기대하고 문자열 리터럴에 사용하는 인코딩을 제어합니다. 항상 명시적으로 설정하세요:
대부분의 드라이버는 연결 문자열에서 문자 집합을 설정하면 이를 자동으로 수행합니다. 연결은 기본적으로 utf8mb4이므로 명시적인 재정의가 필요한 경우는 드뭅니다.

콜레이션이 쿼리에 미치는 영향

콜레이션은 WHERE, ORDER BY, 고유성에 영향을 줍니다:
컬럼의 기본값과 다른 콜레이션으로 정렬하려면:

utf8에서 utf8mb4로 변환하기

레거시 데이터베이스가 utf8(3바이트)을 사용한다면 변환하세요:
새 연결의 기본값을 utf8mb4로 만들기 위해 서버 구성도 업데이트하세요:
큰 테이블의 변환은 시간이 걸리고 테이블을 재구축합니다. 유지 보수 윈도 중에 예약하거나 온라인 스키마 변경 도구를 사용하세요.

자주 묻는 질문

MySQL의 utf8은 왜 이모지를 지원하지 않나요?

MySQL의 utf8은 4바이트 유니코드 확장보다 앞선 비표준 3바이트 UTF-8 부분 집합입니다. 이모지(와 다른 많은 현대 유니코드 문자)는 4바이트가 필요합니다. utf8mb4가 UTF-8의 올바른 완전한 구현입니다. 이전 utf8 별칭은 하위 호환성을 위해서만 존재합니다 — 새 스키마에는 절대 사용하지 마세요.

콜레이션 변경이 기존 데이터에 영향을 주나요?

콜레이션 변경은 저장된 바이트를 변경하지 않습니다. 그 바이트가 비교되고 정렬되는 방식을 변경합니다. 다만 고유 인덱스는 콜레이션을 사용하여 적용되므로, _bin에서 _ci로 변경하면 먼저 해결해야 하는 충돌(Alice와 alice가 같아짐)이 드러날 수 있습니다.

어떤 콜레이션을 사용해야 하나요?

대부분의 사용 사례에는 utf8mb4_0900_ai_ci — 기본 콜레이션이며 유니코드를 잘 처리합니다. 정확한 바이트 일치가 필요할 때만 utf8mb4_bin을 사용하세요. 새 프로젝트에서는 utf8mb4_general_ci를 피하세요 — _0900_ai_ci보다 오래되었고 일부 유니코드 경계 사례를 잘못 처리합니다.

문제 해결

참고