[mysql 에 저장된 한글이 깨질 경우에 대한 결론]
-. 아래 3가지 항목을 확인하자
1. mysql의 기본 character set을 utf8로 변경한다. 2. table의 기본 character set을 utf8로 변경한다. 3. column의 character set을 utf8로 변경한다. 이렇게 3가지를 다하니 한글이 잘 보인다......
|
[mysql의 기본 character set 을 utf8로 변경]
mysql 초기값을 보면 latin1 으로 character set이 설정되어 있다.
이로 인해 한글이 제대로 표시가 되지 않는데 django에서 보면 표시가 되지 않거나 깨져서 보인다.
검색을 좀 해보니 mysql의 기본 encoding을 utf8로 변경해야 한다고 한다.
[/etc/mysql/my.cnf]
[client] port = 3306 socket = /var/run/mysqld/mysqld.sock default-character-set = utf8 ... [mysqld] # # * Basic Settings # user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking character-set-client-handshake = FALSE init_connect = "SET collation_connection = utf8_general_ci" init_connect = "SET NAMES utf8" character-set-server = utf8 collation-server = utf8_general_ci ... [mysqldump] quick quote-names max_allowed_packet = 16M default-character-set = utf8 [mysql] default-character-set = utf8
하지만 이렇게 변경 후 service mysql restart를 했지만
이번에는 ????? 로 표시가 된다.
[table의 기본 character set 을 utf8로 변경]
알고 보니 table에도 character set 속성이 적용되어 있다.
기본적인 이해로 my.cnf의 character set을 utf8로 바꿔주면 이후 생성되는 table은 utf8 로 생성이 되어야 할 것 같은데
django를 이용해서 생성해서 인지 latin1으로 생성되고 있었다.
[table의 default character set이 latin1으로 되어 있음]
mysql> show create table polls_choice; +--------------+---------------------------------------+ | Table | Create Table +------------+---------------------------------+ | polls_choice | CREATE TABLE `polls_choice` ( `id` int(11) NOT NULL AUTO_INCREMENT, `choice_text` varchar(200) NOT NULL, `votes` int(11) NOT NULL, `question_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `polls_choice_7aa0f6ee` (`question_id`), CONSTRAINT `polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 +--------------+---------------------------------------+ 1 row in set (0.00 sec)
[table의 default character set 변경]
mysql> alter table polls_choice default character set = utf8; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0
[table의 default character set이 utf8로 변경됨]
mysql> show create table polls_choice; +--------------+---------------------------------------+ | Table | Create Table +--------------+---------------------------------------+ | polls_choice | CREATE TABLE `polls_choice` ( `id` int(11) NOT NULL AUTO_INCREMENT, `choice_text` varchar(200) CHARACTER SET latin1 NOT NULL, `votes` int(11) NOT NULL, `question_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `polls_choice_7aa0f6ee` (`question_id`), CONSTRAINT `polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +--------------+---------------------------------------+ 1 row in set (0.00 sec)
위 과정을 통해 table의 default character set이 utf8로 변경되었음을 확인할 수 있었지만
정작 varchar 를 사용하는 column은 latin1으로 되어 있다.
[column의 기본 character set 을 utf8로 변경]
이에 다시 한 번 column의 character set을 변경해 주는 작업을 했다.
[Column의 character set 을 utf8로 변경]
mysql> alter table polls_choice modify choice_text varchar(200) character set utf8; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0
[변경된 내용 확인, column의 latin1설정이 사라짐]
mysql> show create table polls_choice; +--------------+---------------------------------------+ | Table | Create Table +--------------+---------------------------------------+ | polls_choice | CREATE TABLE `polls_choice` ( `id` int(11) NOT NULL AUTO_INCREMENT, `choice_text` varchar(200) DEFAULT NULL, `votes` int(11) NOT NULL, `question_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `polls_choice_7aa0f6ee` (`question_id`), CONSTRAINT `polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +--------------+---------------------------------------+ 1 row in set (0.00 sec)
Reference
https://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html
http://ra2kstar.tistory.com/97
'Database' 카테고리의 다른 글
[Database/mysql] on delete cascade 에 대한 이해 (0) | 2016.12.23 |
---|---|
[Mysql] database 백업(backup) / 복구(restore) (0) | 2016.12.03 |
Database 생성 및 권한 주기 (0) | 2016.01.11 |
CRUD on mysql (select, update, insert, delete) (0) | 2015.12.12 |
Mysql 사용자 조회/추가/생성/삭제 (0) | 2015.10.29 |
텍스트 파일을 database에 저장하는 방법 (0) | 2015.10.27 |
file로 부터 insert data 방법 (0) | 2015.05.30 |