컴퓨터 / Computer

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

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

티셔츠 17수 라운드 반팔 프린트스타 베이직 오버핏 남녀공용
고급스러운 파스텔톤 컬러 아놀드파마 숙녀 메쉬 단목 0015iu
참빗(A-18)
신형 가이드 컷트빗 곡선형 커트 빗 바리깡 셀프이발
롯데 효도라디오 ATX-08 TF재생 SOS경보음 손전등
캐논 유지보수카트리지 MC-G01
오젬 갤럭시탭S7 가로/세로거치 펜홀더 케이스
유파 전기토스터 EK-222W
접이식 좌식 소파 체어 1인 등받이 방석 바닥 의자
이케아 YLLEVAD 윌레바드 미니액자 화이트13x18cm
우드케어 오일스테인 woodcare 10리터
벽데코타일DIY접착식10P 데코타일 셀프인테리어 타일
남성 조깅 헬스 스포츠 반바지 속바지 레깅스 운동복
카프리썬 오렌지 200ml x 20입 (10입x2박스)
(냉장)칠갑 생메밀면 1KGX10EA)
초슬림 만능 틈새 먼지 브러쉬 다용도 청소솔

아이코닉스 띠띠뽀 말하는 관제센터 놀이세트 (729182)
칠성상회
하이브리드 와이퍼 윈도브러쉬 국내 전차종 350-650mm
칠성상회

맨위로↑