mysql UTF-8로 이전하기

[서버운영] utf-8 로 이전하기.[수정]  
 
 글쓴이   송효진  날 짜 07-12-17 11:15  조 회 613
 
 
utf-8 로 이전하기.


1. MySQL


– euckr 스키마 백업
mysqldump –all-databases –no-data –set-charset=euckr -p > backup.scheme.sql


– euckr 자료 백업
mysqldump –all-databases –no-create-db –set-charset=euckr -p > backup.data.sql


웬만하면 사용자계정 정보는 암호까지 확실하게 알고있자.
GRANT ALL 쿼리문을 직접 작성하여 가지고 있자.


– UTF-8 을 제대로 지원하기 위해 버전을 5.x 로 올린다.
(varchar(1) 은 1byte 가 아닌 한글자를 의미하게 된다.
set names 만으로 클라이언트의 캐릭터셋을 맞출 수 있다.)
= backup.scheme.sql =
테이블 중 BLOB 형식이나 BINARY 속성 필드에 문자열이 들어가는 곳이 있다면,
TEXT 형식으로 바꾸거나 BINARY 속성을 없앤다.
DEFAULT \’0\’ 같은 잘못된 따옴표를 고친다.
TYPE=MyISAM 같은건 ENGINE=MyISAM 으로 수정한다.
맨 위쪽의 SET NAMES euckr 을 제외한 모든 CHARACTER SET 의 euckr 을 utf8 로 수정한다.


cat backup.scheme.sql | mysql -p


= backup.data.sql =
head backup.data.sql # 맨 위쪽에 SET NAMES euckr 이 있으면 충분하다.
cat backup.data.sql | mysql -p


– 사용자계정을 GRANT ALL 문으로 다시 만들어준다.
root 지워버리지 않게 주의.



이전 MySQL 에 charset 관련 옵션이 없다면,
스키마는
cat backup.scheme.sql | mysql -p –default-character-set=utf8
데이터는
cat backup.data.sql | mysql -p –default-character-set=euckr
로 복구하면 된다.
스키마는 꼭 꼼꼼히 살펴보고 편집하자.



2. 파일
모든 파일의 내용을 utf8 로 바꾸자.
조건에 따라 동작이 달라지므로 php 를 이용하자.
/toutf.php
<?php


$f = $_SERVER[\’argv\’][1];
if(!file_exists($f)) {
    echo $f.\” file not found.\\n\”;
}


$text = file_get_contents($text);
$text8 = @iconv(\’CP949\’, \’UTF-8//IGNORE\’, $text);


$cnt = strlen($text);
$cnt8 = strlen($text8);
if($cnt <= $cnt8) {
    // 제대로 변경이 되었다면 용량이 커졌을 것이다.
    // 용량이 같다면 한글이 없는 것이다.
    rename($f, $f.\’.euckr\’); // 백업
    file_put_contents($f, preg_replace(\’/charset=euc-kr/i\’, \’charset=utf-8\’, $text8));
    echo $f.\” file is converted.\\n\”;
} else {
    // 용량이 작아진다면 잘못된 것이다.
    $fp = fopen(\’/error.txt\’, \’a\’);
    fwrite($fp, $f.\”\\n\“);
    fclose($fp);
}


?>


find /home -type f -name \”*.php\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.inc\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.txt\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.html\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.htm\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.js\” -exec php /toutf.php \”{}\” \\;
find /home -type f -name \”*.css\” -exec php /toutf.php \”{}\” \\;



현재 UTF-8 이 아닌 곳이 없기 때문에,
기억을 더듬어 대충 만들었다.
적용전 백업은 필수다.


에디터는 EmEditor, DreamWeaver CS3 를 추천한다.
FTP 는 WinSCP 4 를 추천한다. 윈도 커멘더 모드로 하면 파일명이 지X 같아도 잘 올리고 받아질 것이다.


WinSCP 의 에디터로 EmEditor 를 설정하면 무적이다.
EmEditor 는 기능이 조금 제한된 free 버전이 있다.
 
  License
본 게시물은 GPL을 따릅니다. [ GPL 안내 ]  
 
 


  
   송효진   07-12-17 11:19  
음… euckr 용 php 글자자르기 함수에 문제가 있을 수 있겠네요.


my.cnf 에서 default-character-set 만 잘 맞춰주면,
DB 접속시에 set names utf8 은 안해도 될겁니다.
그래도 php 에다 저거 한줄 추가하는게 속 편할것 같네요.  
 
음… euckr 용 php 글자자르기 함수에 문제가 있을 수 있겠네요.


my.cnf 에서 default-character-set 만 잘 맞춰주면,
DB 접속시에 set names utf8 은 안해도 될겁니다.
그래도 php 에다 저거 한줄 추가하는게 속 편할것 같네요.
        
   전진하는아르고   07-12-17 12:07  
여러 도메인을 사용할때를 대비해서 한줄추가가 가장 속 편한듯 싶네요.  
 
여러 도메인을 사용할때를 대비해서 한줄추가가 가장 속 편한듯 싶네요.
  
   신의손   07-12-17 11:26  
스크랩했습니다. 이번 서버업글때 써먹어야겠네요.. 좋은정보 감사합니다.^^  
 
스크랩했습니다. 이번 서버업글때 써먹어야겠네요.. 좋은정보 감사합니다.^^
  
   허생   07-12-17 11:27  
예전에 UTF-8로 이전할때 파일을 하나하나 따로 열어서 속성을 변경해줬던 기억이 있는데…
이렇게 한방에 해결가능하군요… 역시 무식하면 손발이 고생~  
 
예전에 UTF-8로 이전할때 파일을 하나하나 따로 열어서 속성을 변경해줬던 기억이 있는데…
이렇게 한방에 해결가능하군요… 역시 무식하면 손발이 고생~
  
   송효진   07-12-17 11:41  
생각해 보니 iconv 로 해야 원하는 동작이 되어 살짝 수정했습니다.  
 
생각해 보니 iconv 로 해야 원하는 동작이 되어 살짝 수정했습니다.
        
   전진하는아르고   07-12-17 12:08  
쩝 근데… 이왕이면 페이지속의 메타태그도… ㅎㅎㅎ  
 
쩝 근데… 이왕이면 페이지속의 메타태그도… ㅎㅎㅎ
            
   송효진   07-12-17 12:51  
그건 되어 있어요.ㅎㅎ  
 
그건 되어 있어요.ㅎㅎ
                  
   전진하는아르고   07-12-17 14:27  
헉… 글쿤요.. 착각했네요.. 요즘 착각을 자주하는걸 보니… 명퇴할때가 되었나 쩝…  
 
헉… 글쿤요.. 착각했네요.. 요즘 착각을 자주하는걸 보니… 명퇴할때가 되었나 쩝…
  
   x딜마   07-12-17 11:46  
좋은 정보 감사 드립니다.
개발 한것 UTF용으로 변환 할려고 계획중이었는데.. 쉽게 처리 될것 같네요.  
 
좋은 정보 감사 드립니다.
개발 한것 UTF용으로 변환 할려고 계획중이었는데.. 쉽게 처리 될것 같네요.
  
   전진하는아르고   07-12-17 12:11  
참고로 저는 euckr에서 옮길때 sql 화일 덤프 받아서 set names euckr 주고 utf8 이 아닌 문서로 올렸더니
에러가 생겼습니다. 그래서 아예 utf8로 sql 파일을 변경하고 올립니다.  
 
참고로 저는 euckr에서 옮길때 sql 화일 덤프 받아서 set names euckr 주고 utf8 이 아닌 문서로 올렸더니
에러가 생겼습니다. 그래서 아예 utf8로 sql 파일을 변경하고 올립니다.
        
   송효진   07-12-17 12:54  
euckr 로 하는 이유는,
흔하지는 않지만 euckr 의 멀티바이트 코드 마저 escape 시켜버리는 것이 있습니다.
예를 들자면, ㅂㅞㄺ 인데 ?\\\’? 이런식이랄까요?
이건 변환이 안되지요.
그런데, euckr 로 넣으면 원래 그런 escape 기 때문에 동작을 합니다.
아마 오류가 스키마에서 났을듯 합니다.
예제에서처럼 분리하여 해 보시면 문제 없을듯 하네요.  
 
euckr 로 하는 이유는,
흔하지는 않지만 euckr 의 멀티바이트 코드 마저 escape 시켜버리는 것이 있습니다.
예를 들자면, ㅂㅞㄺ 인데 ?\\\’? 이런식이랄까요?
이건 변환이 안되지요.
그런데, euckr 로 넣으면 원래 그런 escape 기 때문에 동작을 합니다.
아마 오류가 스키마에서 났을듯 합니다.
예제에서처럼 분리하여 해 보시면 문제 없을듯 하네요.
  
   낭망백수   07-12-17 12:35  
전체적으로
버전 5.x 로의 이전에 해당하는 것과 UTF-8로의 이전에 해당하는 것을 좀 가릴 필요가 있겠는데요.
그리고 이왕이면 각 수정항목에 대한 설명도. ^^;;;


진짜 궁금한건 BINARY 를 왜 없애야하는지 궁금합니다.
전부터 궁금했는데 아직도 이유를 모르겠네요. 매뉴얼이나 MySQL 사이트설명도 애매하고. ㅋ


제가 생각하는 제일 간단한 방법은 밀어넣을때 setCharacter 지정하는 것이아니라
밀어넣는 것은 그대로 걍 sql로 밀어넣고
신버젼의 Database 만(스키마없이) UTF-8 로생성하고 나머지 그대로 걍 다 밀어넣는것입니다.
들어갈때 알아서 UTF-8 바뀌더군요.
(BINARY 는 바꾸지 않았는데 괜찮더군요. 앞으로 무슨 문제가 있을지 모르겠지만 ㅡㅡ;;)


꾸벅~!  
 
전체적으로
버전 5.x 로의 이전에 해당하는 것과 UTF-8로의 이전에 해당하는 것을 좀 가릴 필요가 있겠는데요.
그리고 이왕이면 각 수정항목에 대한 설명도. ^^;;;


진짜 궁금한건 BINARY 를 왜 없애야하는지 궁금합니다.
전부터 궁금했는데 아직도 이유를 모르겠네요. 매뉴얼이나 MySQL 사이트설명도 애매하고. ㅋ


제가 생각하는 제일 간단한 방법은 밀어넣을때 setCharacter 지정하는 것이아니라
밀어넣는 것은 그대로 걍 sql로 밀어넣고
신버젼의 Database 만(스키마없이) UTF-8 로생성하고 나머지 그대로 걍 다 밀어넣는것입니다.
들어갈때 알아서 UTF-8 바뀌더군요.
(BINARY 는 바꾸지 않았는데 괜찮더군요. 앞으로 무슨 문제가 있을지 모르겠지만 ㅡㅡ;;)


꾸벅~!
        
   송효진   07-12-17 12:54  
BINARY 는 말 그대로 바이너리 입니다.
캐릭터 취급을 안하지요. 캐릭터셋 변환이 안되요.
구 버전에서 BINARY 를 썼던 이유중 가장 큰것이,
latin1 으로 해서 정렬이 엉망이 되기 때문이었지요.


5.x 는 필수라고 생각해서 나누지는 않고 당의성에 대한 설명을 추가했습니다.  
 
BINARY 는 말 그대로 바이너리 입니다.
캐릭터 취급을 안하지요. 캐릭터셋 변환이 안되요.
구 버전에서 BINARY 를 썼던 이유중 가장 큰것이,
latin1 으로 해서 정렬이 엉망이 되기 때문이었지요.


5.x 는 필수라고 생각해서 나누지는 않고 당의성에 대한 설명을 추가했습니다.
            
   낭망백수   07-12-17 13:02  
그럼 binary packing 이 어떻게 이루어지는지 궁금하군요. unpacking 은?
(그런데 왜 저는 제대로 나올까요? ㅡㅡ;)


ps; 짐 free emeditor 기능제한이 뭐죠? 쓰다가 적응안되서 포기한 1人  
 
그럼 binary packing 이 어떻게 이루어지는지 궁금하군요. unpacking 은?
(그런데 왜 저는 제대로 나올까요? ㅡㅡ;)


ps; 짐 free emeditor 기능제한이 뭐죠? 쓰다가 적응안되서 포기한 1人
                  
   송효진   07-12-17 13:12  
PostgreSQL 과는 개념이 조금 다릅니다.
pgsql 에서는 bytea 로 패킹을 하지만,
MySQL 에서는 패킹하는것이 아니고, 그냥 binary 취급만 해 주는 것입니다.
varchar(1) binary 는 1byte 를 의미하게 되겠죠.


utf-8 로의 이전시에 iconv 로 변환하거나 한 적이 없는데,
set names euckr 로 잘 들어갔다면,
php 에서도 set names euckr 인 상태가 아닌지 확인이 필요하겠습니다.


emeditor free 는 tools 없고 (diff 등), 탐X기 마우스 우클릭에 메뉴 없다는것 정도 입니다.
트레이 아이콘 제공도 안하던가…
기본적으로 utf-8 이 아니기 때문에 옵션은 조금 손봐줄 필요가 있습니다.
가장 좋게 생각하는 기능이 우하단의 현재 캐릭터셋 표시를 더블클릭하면,
바로 어떤 캐릭터셋으로든 다시 불러올 수 있다는 것입니다.
다른 이름으로 저장시에 어떤 캐릭터셋으로도 변환할 수 있고요.  
 
PostgreSQL 과는 개념이 조금 다릅니다.
pgsql 에서는 bytea 로 패킹을 하지만,
MySQL 에서는 패킹하는것이 아니고, 그냥 binary 취급만 해 주는 것입니다.
varchar(1) binary 는 1byte 를 의미하게 되겠죠.


utf-8 로의 이전시에 iconv 로 변환하거나 한 적이 없는데,
set names euckr 로 잘 들어갔다면,
php 에서도 set names euckr 인 상태가 아닌지 확인이 필요하겠습니다.


emeditor free 는 tools 없고 (diff 등), 탐X기 마우스 우클릭에 메뉴 없다는것 정도 입니다.
트레이 아이콘 제공도 안하던가…
기본적으로 utf-8 이 아니기 때문에 옵션은 조금 손봐줄 필요가 있습니다.
가장 좋게 생각하는 기능이 우하단의 현재 캐릭터셋 표시를 더블클릭하면,
바로 어떤 캐릭터셋으로든 다시 불러올 수 있다는 것입니다.
다른 이름으로 저장시에 어떤 캐릭터셋으로도 변환할 수 있고요.
                      
   낭망백수   07-12-17 13:22  
오호~ 오호~ 연발이군요. 감사합니다. 스트랩도 하구요. ^^;  
 
오호~ 오호~ 연발이군요. 감사합니다. 스트랩도 하구요. ^^;
  
   하늘처럼™   07-12-17 13:09  
이제 스쿨이 utf-8로 가는 일만 남은거죠?  
 
이제 스쿨이 utf-8로 가는 일만 남은거죠?
        
   낭망백수   07-12-17 13:21  
ㅎㅎㅎㅎ.  
 
ㅎㅎㅎㅎ.
        
   전진하는아르고   07-12-17 14:28  
스쿨은 euc-kr 였군요…  
 
_PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG__PS||MG_