MySQL character set 변경 방법 UTF-8
MySQL을 윈도우 환경에 설치하고 이것저것 테스트를 하고 있었습니다. 그런데 실제 데이터베이스를 인서트 하려고 보니 한글이 자꾸 물음표로 나오더군요. 그래서 MySQL Workbench에서 상태를 확인해보니 character set이 latin1로 세팅이 되어 있었습니다.
아마 예전에 MySQL을 설치 할때 캐릭터 셋을 제대로 설정하지 않은 것 같았습니다. 나름대로 정보도 많이 찾아보고 MYSQL 버전마다 모두 방법이 달라서 시간이 꽤 걸렸습니다.
먼저 MYSQL의 캐릭터 셋 확인하기 위해서는 쿼리 명령어로도 가능합니다. 캐릭터 셋을 latin1 에서 utf8로 변경하여 전 utf8로 나오는데 대부분 latin1이나 다른 거로 돼 있으실 겁니다. show variables like 'char%'; 명령어를 통해서 현재 MySQL에 character set 확인이 가능합니다.
물론 MySQL Workbench에서도 현재 캐릭터 셋 확인하실 수 있습니다. MySQL Workbench - Status and System Variables 메뉴를 누르시고 System Variables 탭 메뉴를 선택 후 char만 검색하셔도 현재 MYSQL 캐릭터 셋이 어떻게 설정되어 있는지 확인하실 수 있습니다.
저와 같은 경우는 MySQL character set이 latin1로 셋팅 되어 있었는데 쿼리문으로 직접 인서트 할때는 한글이 잘들어가는데 프로그램을 통해서 INSERT를 했을때는 계속 물음표로 찍히더군요.
프로그램에서는 UTF8 데이터를 보내 물음표가 표시 되었고 MYSQL에서 직접 인서트 하는 경우는 한글이 잘 표시 되더군요.
프로그램에서는 전송하는 character set 타입과 MySQL에 세팅된 character set 타입이 맞지 않아 물음표로 표시되었던 것 같고 직접 DB에 쿼리문을 INSERT 하는 경우는 특정 캐릭터셋을 지정하지 않고 직접 인서트 하는 경우 한글이 표시되다 보니 처음에는 문제가 무엇인지 파악하기 힘들었습니다.
결국엔 MySQL 서버 자체 캐릭터 셋을 UTF8로 변경하니 정상적으로 한글이 표시되었습니다.
MySQL 캐릭터 셋을 쿼리문을 통해서도 세팅할 수 있지만 서버를 켰다가 끄게 되면 다시 세팅해야 줘야 하기 때문에 근본적인 해결은 되지 않고 결국엔 MySQL에 설정 파일을 수정해줘야 한다는 것이었습니다.
추가로 MySQL에 캐릭터 셋에 관련하여 정보를 찾아보면서 제가 헤맸던 부분은 실제 MYSQL 캐릭터를 세팅하는 my.ini나 my.cnf 파일을 찾을 수 없었다는 겁니다. MySQL에 버전이나 운영체제에 따라서 실제 MySQL 세팅 파일이 있는 곳이 다릅니다.
C:\Program Files\MySQL\MySQL Server 5.7폴더에 있다고 하시는 분도 있을 테고 특정 폴더에 MySQL을 설치하신 분들은 아예 지정한 경로가 다를 수 있습니다. 제가 다운로드 받았던 mysql 5.7 버전은 C:\ProgramData\MySQL\MySQL Server 5.7 폴더에 MySQL 세팅 파일이 있더군요.
ProgramData 폴더가 안 보이시는 분들은 숨겨진 폴더를 볼 수 있게 설정해 주시면 됩니다. (http://zzarungna.tistory.com/486) 어딘가에 mysql 설정 파일은 반드시 존재하니 우선 MySQL 설정 파일이 어디 있는지 찾아 보시는 게 중요합니다.
MySQL Workbench를 통해서도 캐릭터 셋 변경이 가능하다고 합니다. 메뉴는 아래 이미지와 같이 Option File 메뉴에서 가능하다고 하는데 저는 Locatin of MySQL configuration file (ie:my.cnf) not specifed 라고 나오더군요 결국엔 설정 파일을 찾을 수 없다고 나와서 이 방법으로 해결이 되는 분들이 있을 수 있으니 MySQL Workbench를 통해서 수정하실 분들은 참고하시기 바랍니다.
저는 MySQL 설정 파일을 찾지 못해서 MySQL Workbench에서 수정할 수 없었습니다.
다행히 저는 찾지 못했던 MySQL 설정 파일을 찾을 수 있었고 아래 이미지와 mysql 설정 파일을 수정하였습니다. MySQL 버전에 따라 설정 파일이 또 다릅니다. 그래서 설정 파일이 다르게 표시되는 경우는 직접 하나씩 테스트하면서 진행하시는 게 가장 좋습니다.
우선제가 수정한 방법을 말씀드리자면 밑줄 영역은 참고만 하시고 빨간색 네모 칸 영역을 실제로 수정해 주니 정상적으로 utf8로 모두 변경 되었습니다.
55라인[client] 아래 영역에 #이 있는 것을 지우고 default-character-set = utf8을 넣어 주었습니다.
63라인[mysql] 아래 라인에도 마찬가지로 #을 지우고 default-character-set = utf8을 넣어 주었습니다.
78라인 [mysqld] 아래 라인에는 아래 추가로 작성하여 넣어주었습니다.
character-set-client-handshake = FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8
MySQL 버전에 따라서 설정 파일 세팅이 다르다 보니 #으로 주석 처리된 부분도 표시 해두었으니 참고 하시기 바랍니다.
저는 위와 같은 방법을 통해서 MySQL character set을 UTF8으로 변경된 것을 확인하였고 실제 프로그램을 통해 인서트 하는 경우도 정상적으로 한글 데이터가 잘 들어 갔습니다.
MySQL 버전에 따라서 MySQL 설정 파일이 있는 경로가 다르기도 하고 설정 파일에 어떤 구문을 추가로 넣어줘야 하는지 다른 경우가 많습니다. 핵심은 MYSQL의 설정 파일인 my.ini 또는 my.cnf 파일을 찾아서 default-character-set=utf8 구문과 [mysqld] 메뉴에 캐릭터셋 설정 코드를 추가해 주는 것입니다.
저는 mysql 설정 파일을 찾지 못해서 시간을 허비하였고 설정 파일을 찾았으나 MySQL 버전에 따라서 캐릭터 셋 인코딩을 변경하는 게 각각 다르다 보니 시간을 많이 허비하였습니다.
인터넷에 있는 자료를 기준으로 설정 파일에 캐릭터 셋 구문을 넣다 보니 MySQL실행이 안되는 경우도 있었습니다. 그러니 MySQL 서버를 중지하시고 MySQL 설정 파일을 한라인씩 수정하시면서 서버가 정상적으로 작동하는지 하나씩 테스트 하시면서 설정 파일의 utf8 구문을 넣어 보시기 바랍니다.
설정 파일을 한번에 변경 하다 보면 서버가 구동이 안되는 경우도 있으니 MySQL 버전에 따라 꼭 하나씩 변경 하면서 MySQL 서버가 구동이 되는지 테스트 해보시기 바랍니다.
저처럼 시간을 허비하지 않았으면 하는 마음으로 나름대로 필요하다고 생각되는 것들을 정리해 보았으니 필요하신 분들은 참고하셔서 문제가 해결되셨으면 좋겠습니다.