[DBMS] mysql 서버 이전시의 캐릭터셋 문제...

 

최근들어 mysql 서버이전을 하면서 캐릭터셋 문제에 봉착하는 사람들이 많아졌다.
그런 분들을 위해 과정을 정리해 봤다 도움이 되었으면 한다.
아래의 정리는 경험을 바탕으로 적었기에 문제는 없을거 같지만 모든 환경을 테스트한것이 아니기에
이게 정답이다라고 할수는 없을것이기에 부족한 부분은 조언을 주셨으면 한다.

보통 3.x대 또는 4.x대에서 오랫동안 사이트를 운영하다 이번에 5.x 로 업하시는 분들이 이런 문제에 많이
봉착한다. 3.x 나 4.x 에서는 국내에 호스팅 환경이 euc-kr, euckr 이 대세였기에...
하지만 요즘은 utf8을 기본 지원하고 extra character set 으로 euckr 을 구축하는게 호스팅사들이 많은거 같다.

Type A 기본 캐릭터셋 euckr 서버에서 기본 캐릭터셋 utf8 서버로의 이전
    1. euckr => euckr 로의 이전
    2. euckr => utf8 로의 이전
Type B 기본 캐릭터셋 utf8 서버에서 기본 캐릭터셋 euckr 서버로의 이전
    3. utf8 => euckr 로의 이전
    4. utf8 => utf8 로의 이전

1. euckr => euckr 로의 이전
    1) mysqldump 를 이용하여 mysql의 sql문을 dump를 받는다.
    2) backup.sql 이란 화일을 받았다면 EditPlus 같은 프로그램으로 최상단에 "set names euckr;" 입력한다.
        Create 문에 "Type=???;" 또는 "ENGINE=???;"를 "Type=??? DEFAULT CHARSET=euckr;" 또는
        "ENGINE=??? DEFAULT CHARSET=euckr;" 로 변경한다.
        EditPlus 에서는 Ctrl + H 로 변경창이 쓴다.
    3) mysql -u user -p < backup.sql
    4) db connection 을 맺는 화일또는 공통설정화일에 아래의 쿼리를 먼저 서버로 날린다.
        "set names euckr;"
        보통 웹프로그램은 별도의 화일을 하나로 두어 include 같은 방식을 취한다.
  5) 위와같이 정의를 함으써 utf8서버에서도 euckr 을 사용할수 있게 되는것이다.

        현재 변환 작업(euckr=>utf 베이스의 euckr)에서 "Data too long for column"이와 같은 오류는
        utf8 베이스의 mysql 서버에 euckr 데이터가 utf8로 입력되어 나오는 오류이다.
        그것을 예방하는것이 "set names euckr" 이며
        아래의 3가지 옵션을 변경하는 것이다.
        character_set_client    euckr
        character_set_connection    euckr
        character_set_results    euckr
        참고로 예전 Mysql 3.x 대에서 euc-kr 이라고 했었던 환경에서는 한글은 varchar(10)에서
        5글자 밖에 들어가지 않았다. 즉 한글자가 2개의 char 값을 차지 했는데...
        최근 버젼들은 euckr 환경이라도 varchar(10)에 한글 10자가 모두 들어간다.

        이전테스트를 하다보니 "ㅤㅅㅏㅍ"이란 문자가 입력이 되질 않았다.
        OS의 문제인지 mysql 의 문제인지 모르지만 국내 주소에 포스코 ?? ㅤㅅㅑㅍ은 오류가 나서 "삽"으로
        바꿨다. 포스코?? 샵 아파트 주민분들에게 욕들어 먹는건 아닐런지 ㅡㅡ;;

2. euckr => utf8 로의 이전
    1) mysqldump 를 이용하여 mysql의 sql문을 dump를 받는다.
    2) backup.sql 이란 화일을 받았다면 EditPlus 같은 프로그램으로 최상단에 "set names utf8;" 입력한다.
        Create 문에 "Type=???;" 또는 "ENGINE=???;"를 "Type=??? DEFAULT CHARSET=utf8;" 또는
        "ENGINE=??? DEFAULT CHARSET=utf8;" 로 변경한다.
        EditPlus 에서는 Ctrl + H 로 변경창이 쓴다.
        그리고 EditPlus에서 저장할때 utf-8 형식으로 저장을 하자
  3) mysql -u user -p < backup.sql
    4) db connection 을 맺는 화일또는 공통설정화일에 아래의 쿼리를 먼저 서버로 날린다.
      "set names utf8;"

        "set names utf8;" 쿼리가 별도로 필요없는 경우도 있는데 이경우는 리눅스 계열이며
        서버 OS 캐릭터셋 자체가 UTF-8인 경우이다. 윈도우의 경우에는 DB와 웹이 UTF8로 설정되었다고
        하더라도 실제 커넥션을 맺어서 확인해 보면 latin1 이 설정되어 있는 경우가 많다.
        아래는 PHP를 통해 실제 윈도우서버(mysql utf8로 설정)에서
        character set 관련 설정을 출력해본 예제이다.
        <?
        $connect = mysql_connect('localhost','user명','user비밀번호');
        $DBresult = mysql_query("show variables like 'char%'",$connect);
        $rows = mysql_affected_rows();
        for ($i=0; $i<$rows; $i++) {
            mysql_data_seek($DBresult,$i);
            $result = mysql_fetch_array($DBresult);
            echo "$result[0] : $result[1]<BR>";
        }

        echo "<BR>";
        mysql_query("set names utf8",$connect);

        $DBresult = mysql_query("show variables like 'char%'",$connect);
      $rows = mysql_affected_rows();
      for ($i=0; $i<$rows; $i++) {
          mysql_data_seek($DBresult,$i);
          $result = mysql_fetch_array($DBresult);
          echo "$result[0] : $result[1]<BR>";
      }

        결과는 아래와 같았다 물론 이와 다를수도 있다. 다만 한번쯤 default character 가 utf8 이라도
        위의 소스로 한번쯤 확인해보는게 좋다.
        자신이 utf8로 설정했다고 하면서 실제로 utf8이 아닌경우도 상당히 많다.
        사실은 저도 이것때문에 삽질을 좀 했다는....

        character_set_client : latin1
        character_set_connection : latin1
        character_set_database : utf8
        character_set_filesystem : binary
        character_set_results : latin1
        character_set_server : utf8
        character_set_system : utf8
        character_sets_dir : C:\\Program Files\\MySQL\\MySQL Server 5.0\\share\\charsets\\

        character_set_client : utf8
        character_set_connection : utf8
        character_set_database : utf8
        character_set_filesystem : binary
        character_set_results : utf8
        character_set_server : utf8
        character_set_system : utf8
        character_sets_dir : C:\\Program Files\\MySQL\\MySQL Server 5.0\\share\\charsets\\

3. utf8 => euckr 로의 이전
  1) mysqldump 를 이용하여 mysql의 sql문을 dump를 받는다.
  2) backup.sql 이란 화일을 받았다면 EditPlus 같은 프로그램으로 최상단에 "set names euckr;" 입력한다.
        Create 문에 "Type=???;" 또는 "ENGINE=???;"를 "Type=??? DEFAULT CHARSET=euckr;" 또는
        "ENGINE=??? DEFAULT CHARSET=euckr;" 로 변경한다.
        EditPlus 에서는 Ctrl + H 로 변경창이 쓴다.
        그리고 EditPlus에서 저장할때 utf-8 형식이 아닌 기본형식으로 저장을 하자
  3) mysql -u user -p < backup.sql
  4) db connection 을 맺는 화일또는 공통설정화일에 아래의 쿼리를 먼저 서버로 날린다.
      "set names euckr;"
        최신버젼에서 Mysql 3.x 대 버젼의 euc-kr 로 이전을 한다면 그건 하지않는것이 ㅡㅡ;;
        그 이유는 위에서 언급한것처럼 한글의 글자 처리(2byte 처리)가 다르기 때문이다.
        그런 이유로 테이블을 다시 설정하거나 최악의 경우 다시 설계해야 하는 경우가 생긴다.


4. utf8 => utf8 로의 이전
  1) mysqldump 를 이용하여 mysql의 sql문을 dump를 받는다.
  2) backup.sql 이란 화일을 받았다면 EditPlus 같은 프로그램으로 최상단에 "set names utf8;" 입력한다.
      Create 문에 "Type=???;" 또는 "ENGINE=???;"를 "Type=??? DEFAULT CHARSET=utf8;" 또는
        "ENGINE=??? DEFAULT CHARSET=utf8;" 로 변경한다.
      EditPlus 에서는 Ctrl + H 로 변경창이 쓴다.
      그리고 UTF-8로 저장이 되어있지 않다면 EditPlus에서 저장할때 utf-8 형식으로 저장을 하자
  3) mysql -u user -p < backup.sql
  4) 기존의 "set names utf8"이 설정되어 있다면 상관없지만 없다면
        db connection 을 맺는 화일또는 공통설정화일에 아래의 쿼리를 먼저 서버로 날린다.
      "set names utf8;"
        위에서도 비슷하게 언급했듯이... show variables like 'char%' 쿼리를 통해
        character_set_client    utf8
        character_set_connection    utf8
        character_set_results    utf8
        이 부분이 다르게 설정했다면 꼭 "set names utf8;" 이부분이 필요하다.



※참고
보통 backup.sql 화일의 언어셋을 변환하는경우 EditPlus 나 그외 편집툴로 바로 바꾸는 경우도 있지만
화일이 큰 경우는 iconv 를 이용하는것도 괜찮다..
iconv -c -s -f $input_encording -t $output_encording $input_file > $output_file

댓글
  • No Nickname
    No Comment
  • 권한이 없습니다.
    {{m_row.m_nick}}
    -