컴퓨터 / Computer

DB 이전 시에 그누보드의 한글이 깨질 경우

공유지기 0 6,978 2016.08.24 22:40

0_fivEmSUN_cafc0046fceae53820e6e11ed19a3a0d3034ec3c.jpg 


7년 넘은 서버에서 동작하던 웹 서비스를 이전하다보니 한글코드 등의 문제로 인해서 한글이 깨져 나오는 경우가 있다. 몇 가지 부분에서 고려해야 할 사항이 있다보니 여러분들의 도움을 받아 그 과정을 기록으로 남겨 본다.

 

옛 서버 

 DB : mysql 4.x

 php : 5.2

 GNU Board : 4

 DB table collation  : latin1_swedish_c1   (utf8, euckr은 이전에 별 문제가 없음)

새 서버

 DB : Maria DB 5.x

 php : 5.3

 GNU Board : 4

 DB table collation : euckr_korean_ci

 DB 서버 character set : utf8

 

1. 옛 서버에서 db dump

옛 서버에서 db dump 하면 latin1 으로 설정되어 있어서 한글 코드를 도저히 살릴 수가 없게 된다. 따라서 아래 명령어로 db dump 해야 한다.

 

 mysqldump -u root -p --default-character-set=latin1  --databases DB명 > DB명.sql

 

기본 설정 언어를 latin1 으로 설정하여 db를  dump 하면 vi 에디터로 봤을때 한글이 깨지지 않는다. 그냥 dump 하면 한글이 다 깨진다. 

 

2. 새 서버로 db 업로드

저기서 생성한 DB명.sql을 새 서버의 적당한 폴더에 업로드를 한다. 

 

3. sql 파일 수정 

그런데, 저 파일을 새 서버의 mysql(혹은 mariadb)에 넣으면 문제가 생긴다. dump한 db sql의 table 문자셋이 latin1이라 한글이 깨진 상태로 들어간다. 그래서 latin1 설정으로 된 것을 euckr로 바꿔야 한다. 한번에 다 바꾸면 절대 안된다. 새 서버에 sql 파일을 업로드하여 vi로 그 파일을 연다. latin1 으로 검색 하여 가장 앞에 나와 있는 두 latin1 은 그냥 "euckr" 로 바꾼다. 즉, 아래 두 부분에 있는 latin1 은 euckr로 바꾼다.

 

/*!40101 SET NAMES latin1 */;


CREATE DATABASE /*!32312 IF NOT EXISTS*/ `nsm` /*!40100 DEFAULT CHARACTER SET latin1 */;
 

DB dump 하는 방식에 따라서 위 두번째 "CREATE DATABASE ..." 는 안 나올 수도 있다. 일단 뒤 두 부분을 바꾸고 나면 남은 것은 아래와 같은 CHARSET 이 있다. 

 

ENGINE=MyISAM DEFAULT CHARSET=latin1;


여기에 해당하는 latin1은 무조건 바꿔줘야 한다. 그런데 그냥 euckr로 바꿀게 아니라 COLLATE 까지 같이 바꿔야 한다. 따라서 파일 내 latin1을 전부 바꿔주는 vi 명령어를 이용한다. 바로 아래줄처럼.

 

%s/latin1/euckr DEFAULT COLLATE=euckr_korean_ci/g 

 

4. DB 생성 및 insert

이렇게 내용을 변형한 다음, mysql을 띄워 DB를 생성한다. 그런 다음에 mysql insert를 아래와 같이 한다.

 

mysql -u root -p DB명 < DB명.sql 

 

이렇게 하면 다 끝날..................까? 그랬으면 이렇게 글도 안 썼을 것이다. 이제 겨우 한 단계를 지났다. 저렇게 insert를 하면 분명히 g4_popular 에서 오류가 난다.  (g4_popular 테이블은 검색어를 저장하는 곳인데, 가끔 이상한 코드가 들어가 있어서 변환에 오류가 나는 경우가 있다.) 만약 오류가 나지 않으면 8번으로 가도록 한다.

 

5. 옛 서버에서 db dump 

다시, "옛 서버"로 돌아가자. 그래서 이번엔 g4_popular을 제외한 상태로 dump 한다.

 

 mysqldump -u root -p --default-character-set=latin1 --ignore-table=DB명.g4_popular --databases DB명 > DB명2.sql

구분을 위해서 DB명2.sql로 만들었다. 

 

6.  2와 3 과정을 반복

 

7. DB insert 

 

mysql -u root -p DB명 < DB명2.sql 

 

이렇게 하면 오류 없이 db가 insert 된다. 그것도 깔끔한 한글 코드 euckr 코드로.

 

8. 그누보드 db 연결 파일 설정

7번까지는 DB를 이전하는 과정이었다. 이렇게만 하면 mysql을 띄워 테이블 정보를 볼때 한글이 안 깨진다. 그런데 그누보드에서는 추가로 설정해야 한글이 "?"로 안 나오고 정상적으로 표시가 된다. 

 lib/common.lib.php 파일을 열어 아래 function을 수정한다.


// DB 연결 
function sql_connect($host, $user, $pass) 

    global $g4; 

    if (strtolower($g4['charset']) == 'utf-8') @mysql_query(" set names utf8 "); 
    else if (strtolower($g4['charset']) == 'euc-kr') @mysql_query(" set names euckr "); 
    return @mysql_connect($host, $user, $pass); 



// DB 선택 
function sql_select_db($db, $connect) 

    global $g4; 

    if (strtolower($g4['charset']) == 'utf-8') @mysql_query(" set names utf8 "); 
    else if (strtolower($g4['charset']) == 'euc-kr') @mysql_query(" set names euckr "); 
    return @mysql_select_db($db, $connect); 

(출처 : http://egloos.zum.com/antamis/v/822593

 

여기까지 하면 한글을 제대로 볼 수 있다. 

 

9. 회원가입 및 로그인 안되는 문제 해결 

 


common.lib.php에 아래 함수를 넣어줍니다. 

function sql_old_password($value) 
{
    $row = sql_fetch(" select old_password('$value') as pass "); 
    return $row[pass]; 


그리고 login_check.php의 15번째줄을 

if (!$mb[mb_id]) { 
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다."); 
} else { //id가 있는경우 
if ( (sql_password($mb_password) != $mb[mb_password]) && (sql_old_password($mb_password) != $mb[mb_password]) ) { 
    alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다."); 



로 바꾸어 줍니다. 더 간단하게도 쓸수 있지만 논리 에러를 내지 않으려고 일부러 길게 썼습니다. 

그리고 register_form.php의 66-67번째 줄을 

if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]) && !($member[mb_password] == sql_old_password($_POST[mb_password]) && $_POST[mb_password])) 
        alert("패스워드가 틀립니다."); 

로 바꾸어 줍니다. 회원 정보 수정시에 한번더 비밀번호를 체크하기에 여기도 넣어주어야 합니다. 

출처 : http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=1212

 

10. 그외 사소한 것들.

php 버전따라 쓰지 않거나 다른 걸로 바뀌는 함수들이 있다. 이런 함수들은 해당 파일을 찾아서 다른 함수들로 바꾸어주면 된다. 대표적으로 아래 두 함수가 그렇다.

 - eregi 함수 

 - split 함수 

 

 

DB 이전이 쉽지는 않은데, 전혀 불가능한 것은 아니다. 그러니 당황하지 말고 위 절차대로 해보기를 바란다.

 

 

 

도움 받은 링크들

 - http://egloos.zum.com/antamis/v/822593

 - http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=1212

Comments

형광색 비옷 안전 우비 작업용 비닐 우의 휴대용 여름
이케아 PARKLA 페르클라 수납박스 55x49x19cm
남자청남방 오버핏 데님셔츠 캐주얼남방 IS-JK24
실리콘 오다리깔창2p 오다리패드 오다리쿠션 휜다리
오젬 갤럭시탭S8 프로텍션 핸드스트랩 케이스
타이탄풀커버필름2매 갤럭시S23울트라 SM-S918N
갤럭시A15 A156L 카드수납 스트랩 목걸이 케이스
갤럭시 A8 2018 사생활 액정보호필름1매
오공 마루커버시트(화이트) WT90 장판보수 테잎형
계양 곰팡이제거 (박사500ml)x(5개)곰팡이제거제
칼라나무목판액자(블루)
이케아 GLASIG글라시그 미니양초홀더 유리5x5cm 5개입
LED L2 충전식 자석 각도조절 랜턴 손전등 후레쉬
강력 수압상승 샤워기 고급메탈호스세트 2m/샤워꼭지
코카콜라 업소용 1.25L 12PET
헬로키티 입체 페이스 화이트 레인부츠

바르네 풀테이프 리필 BGT-0180R 12개 MB O
칠성상회
칠성당 연벼루3호 (135x225)
칠성상회

맨위로↑