어떤 증상인가요
복구 전
INSERT INTO wp_posts (post_title) VALUES ('한글 사랑 서울');복구 후
INSERT INTO wp_posts (post_title) VALUES ('한글 사랑 서울');원인은 어디에 있나요
워드프레스는 글을 UTF-8로 저장합니다. 그런데 오래된 설치본은 테이블을 latin1로 만들었거나 latin1로 접속하는 경우가 많습니다. 쓰기와 읽기에서 같은 실수를 하는 동안에는 아무도 눈치채지 못합니다. 새 서버로 옮기거나, phpMyAdmin으로 백업하거나, 접속 문자 집합을 바꾸는 순간 모든 한글이 한꺼번에 깨집니다.
wp-config.php의DB_CHARSET이latin1이거나 테이블과 맞지 않는다.- 덤프를
latin1로 내보내고utf8mb4로 가져왔다(또는 그 반대). - 플러그인이나 가져오기 스크립트가 이미 깨진 텍스트를 한 번 더 변환했다. 이것이 이중 깨짐입니다.
백업 파일 복구하기
- 무엇이든 바꾸기 전에 데이터베이스를 백업합니다.
- 문제가 있는 테이블을
.sql파일로 내보냅니다. phpMyAdmin도 되고,mysqldump --default-character-set=utf8mb4도 됩니다. - 위 입력란에 파일을 끌어다 놓습니다. Mojibuster는 깨진 부분만 고치고 바뀐 곳을 모두 보여 줍니다.
- 복구된 파일을 내려받아
utf8mb4로 새 테스트용 데이터베이스에 가져옵니다. - 사이트를 확인하고, 문제가 없으면 운영 데이터베이스에 가져옵니다.
덤프는 업로드되지 않습니다. 덤프에는 보통 회원 계정, 이메일 주소, 댓글이 들어 있으므로 중요한 점입니다.
직렬화된 데이터 주의
워드프레스는 일부 설정을 wp_options와 wp_postmeta에 s:6:"한글"; 같은 PHP 직렬화 값으로 저장합니다. 숫자는 글자 수가 아니라 바이트 수입니다. 깨진 글자를 되돌리면 길이가 맞지 않게 되어 워드프레스가 그 값을 버립니다. 그러니 wp_posts, wp_comments, wp_terms 같은 본문 테이블을 먼저 복구하세요. 옵션 값은 길이까지 갱신해 주는 WP-CLI의 wp search-replace가 더 알맞습니다.
MySQL에서 원인 바로잡기
- 테이블과 접속을
utf8mb4로 바꾸고wp-config.php에define('DB_CHARSET', 'utf8mb4');를 설정합니다. latin1열에 UTF-8 바이트가 들어 있다면 바로 변환하지 마세요. 한 번 더 인코딩됩니다. 보통은 이진 형식을 거칩니다. 먼저MODIFY … LONGBLOB, 그다음MODIFY … LONGTEXT CHARACTER SET utf8mb4입니다.- 모든 변경은 먼저 데이터베이스 복사본에서 시험하세요.
자주 묻는 질문
워드프레스 데이터베이스 전체를 한 번에 복구할 수 있나요?
네, 큰 SQL 덤프도 처리됩니다. 다만 wp_options와 wp_postmeta의 직렬화 데이터는 WP-CLI가 더 적합합니다.
덤프 안의 멀쩡한 글자가 바뀌지는 않나요?
아니요. Mojibuster는 분명히 깨진 부분만 복구하고 올바른 텍스트는 그대로 둡니다.
utf8과 utf8mb4는 무엇이 다른가요?
MySQL의 utf8은 최대 3바이트 문자까지만 저장해서 이모지가 사라집니다. utf8mb4가 진짜 UTF-8이며 워드프레스에는 이쪽이 맞습니다.
워드프레스 말고 다른 시스템에도 쓸 수 있나요?
네. 그누보드, Joomla, Drupal, Magento, MySQL·MariaDB 기반 자체 서비스도 같은 문제와 같은 해결법이 적용됩니다.