MySQL에 한글을 저장했는데 글자가 ??? 나 깨진 문자로 보인 적 있으신가요? 원인은 대부분 문자셋(charset) 불일치입니다. 한 군데만 어긋나도 깨집니다. 이 글에서 어디를 맞춰야 하는지 순서대로 정리합니다.
결론부터: utf8 말고 utf8mb4
MySQL의 utf8은 사실 최대 3바이트만 저장하는 반쪽짜리라 이모지·일부 한자에서 문제가 생깁니다. 반드시 utf8mb4 와 정렬(collation) utf8mb4_unicode_ci 를 쓰세요.
1) 테이블·컬럼 생성 시
CREATE DATABASE app_blog
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE posts (
title VARCHAR(300)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;2) 접속(커넥션) 문자셋 — 가장 흔한 범인
테이블이 utf8mb4여도, 접속할 때 문자셋을 지정하지 않으면 깨집니다.
PDO:
$dsn = 'mysql:host=localhost;dbname=app_blog;charset=utf8mb4';
$pdo = new PDO($dsn, $user, $pass);mysqli:
$conn = mysqli_connect($h, $u, $p, $db);
mysqli_set_charset($conn, 'utf8mb4');3) SQL 파일을 임포트할 때
.sql 파일은 UTF-8(BOM 없음)로 저장하고, 임포트할 때 문자셋을 명시합니다.
mysql --default-character-set=utf8mb4 -u root -p app_blog < dump.sql한글 코멘트·데이터가 깨지면 파일 자체보다 임포트 클라이언트 문자셋 불일치가 원인인 경우가 대부분입니다.
4) 이미 깨진 데이터는?
문자셋을 고쳐도 이미 잘못 저장된 글자는 자동으로 복구되지 않습니다. 설정을 먼저 바로잡은 뒤, 데이터를 다시 입력하거나 백업에서 올바른 문자셋으로 재임포트해야 합니다.
점검 순서 요약
- DB·테이블·컬럼이 utf8mb4 인가
- 접속 시 charset=utf8mb4 를 줬는가
- 임포트 시 --default-character-set=utf8mb4 를 줬는가
- 그래도 깨지면: 데이터가 이미 깨진 상태인지 확인
위 네 가지만 맞추면 한글 깨짐은 거의 사라집니다.