2009. 3. 2. 13:56
utf-8 로 이전하기
2009. 3. 2. 13:56 in 팁&테크/PHP
utf-8 로 이전하기. 1. MySQL -- 5.x -- - euckr 스키마 백업 mysqldump --all-databases --no-data --default-character-set=euckr -p > backup.scheme.sql - euckr 자료 백업 mysqldump --all-databases --no-create-db --no-create-info --default-character-set=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 --default-character-set=utf8 mysql 설정이 utf8 기준이고, sql 문에 SET NAMES euckr 이 들어있다. 즉, 생성은 utf8 로 되지만, 데이터가 euckr 이라는것을 알고 있으므로, 자동으로 변환되어 들어간다. 이는 iconv 를 이용한 변환보다 안전하다. (MySQL 의 옛날 버전은 멀쩡한 한글조차 escape 시켜 놓는 경우가 있다.) = backup.data.sql = cat backup.data.sql | mysql -p --default-character-set=utf8 - 사용자계정을 GRANT ALL 문으로 다시 만들어준다. root 지워버리지 않게 주의. -- old -- 이전 MySQL 에 charset 관련 옵션이 없다면, 스키마는 cat backup.scheme.sql | mysql -p --default-character-set=utf8 데이터는 cat backup.data.sql | mysql -p --default-character-set=euckr 로 복구하면 된다. 스키마는 꼭 꼼꼼히 살펴보고 편집하자. 스키마에 한글로 된 주석 같은것이 있다면, 지워버리는것이 속 편하지만, 살리고자 한다면, 편집이 필요하다. backup.scheme.sql 을 열고 맨 위에 SET NAMES euckr; 을 적어주자. 다른 줄에 SET NAMES 가 없어야 한다. 그리고 CREATE DATABASE, CREATE TABLE 문에 일일히 CHARACTER SET utf8; 을 붙여주자. 편집시 편집기에 의해 캐릭터 셋이 변경되지 않도록, 별 기능 없는 편집기를 이용하자. 2. 파일 모든 파일의 내용을 utf8 로 바꾸자. 조건에 따라 동작이 달라지므로 php 를 이용하자. /toutf.php <?php $f = $_SERVER['argv'][1]; if(!file_exists($f)) { echo $f." file not found.\n"; } $text = file_get_contents($f); $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 버전이 있다. |
Posted by 와이즈번