컴퓨터 / Computer

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

공유지기 0 9,166 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

투라인 스포티포인트 찍찍이 아동 운동화 205392
키밍 기능성 스포츠 장갑 스마트폰 터치 방한 글로브
BYC 여성 내복 60수 프라임 상하 DOLT6658-화이트
부드럽고 포근한 소프트 터치 약기모 라운드티
한일의료기 극세사누빔 절전형매트 전기방석 180cm
LG 그램17 17Z90S 노트북 코팅키스킨
키친아트 핸디블랜더 거품기 분쇄기 주서기 믹서기
LG 울트라PC 17UD70P 노트북 코팅키스킨(지문뚫림)
원형 LED 직부등 엣지 6인치 16W 주광 KS 자석타입
심플 부착식 정리 수납함 미니 수납 서랍장
해동지(월드 420x365MM 1줄(100개)
브이텍 벽지 접착제125g VT107K 벽지풀 이음새 보수용
고급 스텐레스스틸 실버주전자 7리터 주방주전자
외풍 차단 샷시형 창틀 바람막이 패드 1m X 5개
업소용 가정용 크린랩 알미늄 쿠킹 호일 33cmx30m
한우물 구운 주먹밥 100g 5종 10개

차량용 메탈 주차번호판 휴대폰번호판 블랙
칠성상회
연필 HB 5본 초등생연필 메모펜슬
칠성상회

맨위로↑