태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

** 그누보드 4 -> 5 컨버팅


0. 각종 환경의 문자셋 charset 확인 및 목표

- 필자의 서버 환경은

서버 charset : euc-kr

MySQL 의 g4 테이블들의 문자셋 : euckr_korean_ci

php 소스의 인코딩 : ANSI

html charset : euc-kr

- 그누보드5 는 utf-8 로만 제공이 되며, 대세는 utf-8 로의 전환이 맞으므로..

신규 그누보드5 사이트는 MySQL  php html 모두 utf-8 로 변환함을 목표로 한다.


1. 그누보드5 신규설치 하기

- 그누보드4가 설치되어 있는 폴더 옆에 그누보드5 를 설치한다. 

- 디비명이나 디비 계정은 같은 것을 사용한다.

- 그누보드4 의 prefix 가 g4_ 라고 가정하고, 그누보드5 는 prefix g5_ 로 설치된다고 전제한다. 


2. g4_import.php 실행

최고관리자로 로그인 후, 그누보드5  폴더에 있는 g4_import.php 를 브라우저에서 호출한다.

g4 폴더의 config.php 파일의 상대경로를 입력한다. 


이렇게 하면 디비 데이타를 이전하게 되는데, 시간이 좀 많이 걸린다. 


3. 변환된 사이트 확인해 보기

완료 후에 새로운  g5 사이트를 확인해 보자.. 잘 변환 되었는가? ^^


필자의 경우엔 문제가 좀 생겼다. 한글이 다 깨졌다. ㅡㅡ

g4_import_run.php 의 열어 보면, euc-kr 일 경우에도 고려하여 코딩이 되어 있다. 

하지만, 여러가지 시도해 보기도 하고, $is_euckr = true; 를 강제로 지정하여 시도해 보아도 한글은 깨진다. ㅡㅡ

출처 : 셈틀누리 블로그


위와 같은 경우, 보통 4 버전에서 utf8을 쓰면 변환 과정에 문제가 없다. 그런데 보통은 4 시절에 euc_kr을 사용하기 때문에 g4_import.php 를 실행하였을때 변환이 끝나면 한글이 깨져 있다. 

위 블로그 주인이 하라는대로 해 봤는데도 안되는 경우가 있는데, 이런 경우엔 아래와 같이 해 보라.

1. 4 버전 폴더로 간다. 

2. vi config.php 를 한다

3. 대략 77라인쯤에 있는 $g4['charset']을 찾는다

4. 보통 여기에 euc_kr로 설정되어 있다. 이걸 그냥 utf8로 바꾼다.


그러고서 저 위 과정을 실행한다. 


저 윗분은 이대표 과정보다 훨씬 더 어려운 경우고 보통은 이대표의 작업 처리만 해도 한글 처리를 무탈하게 할 수 있다. (아니 그렇게 해야 한다. 안 그러면 머리가 더 아프다 ㅠ.ㅠ ) 



신고
Posted by 이대표 이대표님

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

 - http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=43108


신고
Posted by 이대표 이대표님
태터데스크를 설정하시기 바랍니다.



티스토리 툴바