Joonas' Note
Django에서 1267, Illegal mix of collations 해결법 본문
aws에서 nginx + uwsgi + django + mysql 환경으로 개발하다가 아래와 같은 에러를 만났다.
요약하면 결국 아래와 같은 에러라는 의미이다.
... (1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) ...
정확히는 Python이나 Django에서의 인코딩 문제는 아니고, mysql에서 발생한 에러였다.
요청한 데이터와 DB의 collation이 서로 충돌한건데, 발생원인도 그렇다. 회원가입 form에서 한글 이름같은 UTF-8를 전송했을 때 위와 같은 에러가 발생했다.
https://stackoverflow.com/a/2150335 에서 해결했는 데, mysql database를 dump 떠서 임시로 저장하고 설정을 바꾼 다음 다시 복구시키는 방법이 있었다.
$ mysqldump --user=username --password=password --default-character-set=latin1 --skip-set-charset dbname > dump.sql
$ sed -r 's/latin1/utf8/g' dump.sql > dump_utf.sql
$ mysql --user=username --password=password --execute="DROP DATABASE dbname; CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;"
$ mysql --user=username --password=password --default-character-set=utf8 dbname < dump_utf.sql
username과 password를 맞게 바꿔주고, 문제가 생긴 데이터베이스를 dbname 자리에 적으면 된다. 명령어들을 간단하게 요약하면 latin1 인코딩으로 덤프를 뜨고 sql 파일로 저장한다. sed를 써서 sql파일 내용 중 latin1을 전부 utf8로 치환하고 mysql에 치환된 덤프 파일을 씌우는 그런 과정.
왜인지 모르겠는데 처음에는 mysql 콘솔에서 database를 확인했더니 데이터베이스가 사라져버렸다. (CREATE ~~ 문이 동작을 안 한거같다.)
블로그에 적으려고 다시 해봤을 때는 문제없이 잘 되었다. 아무래도 어디서 오타가 난 모양.
다행히 django의 경우에는 sql migration 파일들을 가지고 있어서 바로 마이그레이션 했는데, 그렇지 않은 경우에는 꼭 작은 데이터베이스를 임시로 만들어 테스트하기를 권장한다.
'개발' 카테고리의 다른 글
메뉴 결정 도우미 (2) | 2017.12.10 |
---|---|
Ubuntu 16.04 LTS에서 MongoDB 설치 오류 정리 (2) | 2017.11.24 |
외부 메일 서버 사용하기 - Sendgrid (0) | 2017.10.30 |
HTML5 + 자바스크립트로 만든 핑퐁 게임 (7) | 2017.10.30 |
MongoDB 설치 후 저장 디렉토리 변경 주의사항 (0) | 2017.10.29 |