오늘 RSS를 테터의 DB로 저장하는 작업을 하다가 UTF-8 때문에 엄청난 삽질을 했습니다(...)
문제는 PHP로 RSS의 데이터를 DB의 테터 테이블로 직접 저장하면, 테터에서 깨져보이는 현상이었습니다. 저는 분명히 Apach, PHP, MySQL에서 문자셋을 전부 utf-8을 셋팅했습니다(!) 그러나 경험부족에서 오는 무지함 때문에 미처 생각치 못했던 부분...
바로 PHP에서 MySQL로 커넥션할 때, "set names utf-8"을 먼저 쿼리로 날려주지 않으면, MySQL 함수로 DB에 저장해봤자 UTF-8로 저장되지 않는다는 사실이었습니다. 결국 딱 한문장 추가해서 문제를 해결했습니다.
그런데 더 어이없는 건, 비록 엉터리로 DB에 저장을 해도, 그걸 그대로 가져와서 IE에다 뿌리면 제대로 잘 나옵니다!! IE에서는 문자열의 패턴을 통해서 인코딩 방식을 알아서 해석하기 때문이죠... 그런데 오히려 그 때문에 저는 "테터가 문제있는거 아냐?" 하고 괜한 의심을 하게되서 왠종일 헛삽질을 한 계기가 되고 말았습니다(...)
그래서 오늘 일을 교훈삼아서, 다시는 실수하지 않도록 기록을 남겨봅니다.
Apache (v2.2.2 기준)
httpd.conf 에서 다음을 추가/수정 한다.
AddDefaultCharset UTF-8
PHP (v5.1.4 기준)
php.ini 에서 다음을 추가/수정 한다.
default_charset = "UTF-8"
MySQL (v5.0 기준)
my.ini 에서 다음을 추가/수정 한다.
[client]
default-character-set=utf8
[mysql]
;default-character-set=latin1 // 주석 처리
default-character-set=utf8
[mysqld]
;default-character-set=latin1 // 주석 처리
default-character-set=utf8
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
character-set-server=utf8
collation-server=utf8_general_ci
그리고, Apache, MySQL 서버를 Restart 시킨다.
PHP 소스에서...
DB에 연결한 후에 "set names utf-8"을 쿼리로 날린다.
MySQLi 확장라이브러리를 사용한다면 이렇게 하면 된다.
$db = new mysqli('Host', 'User', 'Password', 'DatabaseName');
$db->query("set names utf8");
추가 사항
PHP, HTML, TXT 파일등, 하여간 모든 파일을 UTF-8로 인코딩해서 저장할 것.
그래야 파일 내에 한글이 섞여있을때 문제가 발생하지않는다.
그리고 당연히 DB를 생성할 때도 문자셋을 UTF-8로 정의해야 한다.
MySQL 콘솔에서는 이렇게 하면 된다.
mysql>CREATE DATABASE DatabaseName DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
문제는 PHP로 RSS의 데이터를 DB의 테터 테이블로 직접 저장하면, 테터에서 깨져보이는 현상이었습니다. 저는 분명히 Apach, PHP, MySQL에서 문자셋을 전부 utf-8을 셋팅했습니다(!) 그러나 경험부족에서 오는 무지함 때문에 미처 생각치 못했던 부분...
바로 PHP에서 MySQL로 커넥션할 때, "set names utf-8"을 먼저 쿼리로 날려주지 않으면, MySQL 함수로 DB에 저장해봤자 UTF-8로 저장되지 않는다는 사실이었습니다. 결국 딱 한문장 추가해서 문제를 해결했습니다.
그런데 더 어이없는 건, 비록 엉터리로 DB에 저장을 해도, 그걸 그대로 가져와서 IE에다 뿌리면 제대로 잘 나옵니다!! IE에서는 문자열의 패턴을 통해서 인코딩 방식을 알아서 해석하기 때문이죠... 그런데 오히려 그 때문에 저는 "테터가 문제있는거 아냐?" 하고 괜한 의심을 하게되서 왠종일 헛삽질을 한 계기가 되고 말았습니다(...)
그래서 오늘 일을 교훈삼아서, 다시는 실수하지 않도록 기록을 남겨봅니다.
Apache (v2.2.2 기준)
httpd.conf 에서 다음을 추가/수정 한다.
AddDefaultCharset UTF-8
PHP (v5.1.4 기준)
php.ini 에서 다음을 추가/수정 한다.
default_charset = "UTF-8"
MySQL (v5.0 기준)
my.ini 에서 다음을 추가/수정 한다.
[client]
default-character-set=utf8
[mysql]
;default-character-set=latin1 // 주석 처리
default-character-set=utf8
[mysqld]
;default-character-set=latin1 // 주석 처리
default-character-set=utf8
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
character-set-server=utf8
collation-server=utf8_general_ci
그리고, Apache, MySQL 서버를 Restart 시킨다.
PHP 소스에서...
DB에 연결한 후에 "set names utf-8"을 쿼리로 날린다.
MySQLi 확장라이브러리를 사용한다면 이렇게 하면 된다.
$db = new mysqli('Host', 'User', 'Password', 'DatabaseName');
$db->query("set names utf8");
추가 사항
PHP, HTML, TXT 파일등, 하여간 모든 파일을 UTF-8로 인코딩해서 저장할 것.
그래야 파일 내에 한글이 섞여있을때 문제가 발생하지않는다.
그리고 당연히 DB를 생성할 때도 문자셋을 UTF-8로 정의해야 한다.
MySQL 콘솔에서는 이렇게 하면 된다.
mysql>CREATE DATABASE DatabaseName DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;




덧글
최근 회사에서 솔라리스+제우스+오라클 환경쪽 세팅때문에 고생좀했...
결국 다른문제였지만...OTL...
RSS에서는 역시 문자 인코딩이 가장 골치아픈것 같습니다. 저는 일단 UTF-8로된 RSS만을 대상으로해서 작업하고 있고, 나중에 변환 코드를 통해서 euc-kr도 지원할 예정입니다. 일단 다국어를 표현하려면 DB와 웹사이트를 UTF-8로 통일하는게 좋습니다. 그러자면 조금 여러가질 셋팅해야하긴 하지만 한번 셋팅해 놓으면 나중에 고생을 덜합니다^^; >> 百鬼夜行_改 님
네, 정말 골치네요. 저는 오늘 MySQL에게 한방 얻어맞은 기분입니다...^^; >> kykisk 님