Joonas' Note

Joonas' Note

Django에서 1267, Illegal mix of collations 해결법 본문

개발

Django에서 1267, Illegal mix of collations 해결법

2017. 11. 17. 19:46 joonas

    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 파일들을 가지고 있어서 바로 마이그레이션 했는데, 그렇지 않은 경우에는 꼭 작은 데이터베이스를 임시로 만들어 테스트하기를 권장한다.

    Comments