뒤늦게 한글 인코딩에 관해 질문합니다.
예전에 이런 질문(http://kldp.org/node/118575)을 한적이 있는데, 비슷하지만, 다른 문제에 다시 직면해서 질문드립니다. Zeroboard XE 를 사용합니다.
( 제가 한글인코딩을 이제와서야 뒤늦게 고생중입니다. )
일단 잘 되는 웹사이트에서 테이블 하나를 백업에서 복구했더니, 한글이 깨졌습니다. 전의 질문처럼 UTF-8 -> cp949 -> UTF-8 인코딩 된듯 보입니다. (아직 확실한건 아닙니다. )
utf-8 덤프화일을 "mysql database_name < dump_file" 하고나서 문제가 생겼습니다. 터미널의 $LANG 변수는 ko_KR.UTF-8 입니다. 데이터 베이스도 utf-8 으로 설정되어 있는데, 어디서 인코딩 체인이 안맞은건지 알수가 없습니다.
일단 조사한것들을 써보면 다음과 같은데, 혹시 제가 더 뒤져봐야 할곳이 있다면, 조언 부탁드립니다.
1. 덤프화일은 일단 UTF-8 인코딩이고, 제 터미널에서 한글이 잘 보입니다.
rchung@rchung-Inspiron-1521:~/kmcc$ file backup.sql backup.sql: UTF-8 Unicode text, with very long lines
2. 제대로 보이는 테이블인 경우, 막상 mysql client 에서 select 를 하면 ?? 로 보입니다. 문제는 터미널 스크린에서 잘보이는 데이터가 웹페이지에서는 잘 안보인다는 겁니다.
mysql> select nick_name from jj_member where member_srl in (4,183); ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 16901691 Current database: kmcckmcc_db2 +-----------+ | nick_name | +-----------+ | ?? | // 이게 user 입장에서는 잘 저장된 형태입니다. | ??? ?? | +-----------+ 2 rows in set (0.00 sec) mysql> select nick_name from jj_member_test2 where member_srl = 4; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 16958042 Current database: kmcckmcc_db2 +-----------+ | nick_name | +-----------+ | 웹팀 | // 이 데이타는 유저의 브라우저에서, 'ê°•ê°•ê°•' 이런 식으로 보입니다. +-----------+ 1 row in set (0.00 sec)
3. 그래서, 혹시 character_set_client 가 latin1 인게 문제인가 의심이 가기는 합니다만, 웹사이트가 호스팅에 있어서 정확한 reproduce 가 쉽지는 않습니다.
mysql> show variables like 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+--------+ 7 rows in set (0.00 sec)
4. 아예 테이블 구성을 다보자고 했을때 다음과 같습니다. 일단 인코딩은 utf-8 으로 되고 있습니다.
mysql> show create table jj_member; | jj_member | CREATE TABLE `jj_member` ( `member_srl` bigint(11) NOT NULL, `user_id` varchar(80) NOT NULL, `email_address` varchar(250) NOT NULL, `password` varchar(60) NOT NULL, `email_id` varchar(80) NOT NULL, `email_host` varchar(160) DEFAULT NULL, `user_name` varchar(40) NOT NULL, `nick_name` varchar(40) NOT NULL, `homepage` varchar(250) DEFAULT NULL, `blog` varchar(250) DEFAULT NULL, `birthday` char(8) DEFAULT NULL, `allow_mailing` char(1) NOT NULL DEFAULT 'Y', `allow_message` char(1) NOT NULL DEFAULT 'Y', `denied` char(1) DEFAULT 'N', `limit_date` varchar(14) DEFAULT NULL, `regdate` varchar(14) DEFAULT NULL, `last_login` varchar(14) DEFAULT NULL, `is_admin` char(1) DEFAULT 'N', `description` text, `extra_vars` text, `change_password_date` varchar(14) DEFAULT NULL, `find_account_question` bigint(11) DEFAULT NULL, `find_account_answer` varchar(250) DEFAULT NULL, `list_order` bigint(11) DEFAULT NULL, PRIMARY KEY (`member_srl`), UNIQUE KEY `unique_user_id` (`user_id`), UNIQUE KEY `unique_email_address` (`email_address`), UNIQUE KEY `unique_nick_name` (`nick_name`), KEY `idx_email_host` (`email_host`), KEY `idx_allow_mailing` (`allow_mailing`), KEY `idx_is_denied` (`denied`), KEY `idx_regdate` (`regdate`), KEY `idx_last_login` (`last_login`), KEY `idx_is_admin` (`is_admin`), KEY `idx_list_order` (`list_order`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
경험 있으신분들 부탁드립니다.
자답
자답입니다.
dump 화일을 그냥 mysql 에 넣으면 안되고, --default-character-set="utf8" 을 지정해 주어야 했었습니다.
즉,
$ mysql --default-character-set="utf8" database_name < dump_file
2번에서 의심했듯이, mysql client 가 latin 이다보니, 유니코드를 유니코드로 해석하지 않았다고 보여집니다.
한글 다루기 어렵네요.
삽질의 대마왕...
댓글 달기