Database

mysql 기본 encoding 변경 (latin1 to utf8)

TechNote.kr 2015. 10. 23. 11:50
728x90

[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://humansoft.kr/bbs/board.php?bo_table=z5_4&wr_id=433

http://ra2kstar.tistory.com/97

728x90