컴퓨터 / Computer

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

공유지기 0 8,058 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

3M 코맨드 와이어 훅 중형 17068 3개입
바이플러스
3M 프리미엄 스티커크리너 PIC10
바이플러스
3M 810 매직테이프 50mm x 65M
바이플러스
OPP 투명접착 8X20+4cm 200장
칠성상회