VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
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보다 오래되었고 일부 유니코드 경계 사례를 잘못 처리합니다.
문제 해결
참고
- MySQL 문자열 함수 — 동작이 콜레이션에 따라 달라지는 문자열 함수
- MySQL의 utf8mb4: 이모지와 완전한 유니코드 저장하기 — utf8 대 utf8mb4 함정과 이모지 저장
- MySQL 대소문자 구분 — 콜레이션이 비교에서 결정하는 것