MYSQL
HOME > DB > MYSQL
2017.04.27 / 20:39

mysql 이미 데이터가 들어간 테이블의 UTF-8 및 각종 문자셋 변환

Scoda
추천 수 67

현재 나의 Fedora Core 3 UTF-8 리눅스 상에서, JDBC와 한글 문제를 일으키지 않는 MySQL 4.1.x 설정 상태는... 

기존 버전에서는 "euc-kr"로 표기되는 문자셋이 "euckr"로 바뀌었다. 

/etc/my.cnf 
[client] 
default-character-set=utf8 
[mysqld] 
default-character-set=utf8 
[mysqldump] 
default-character-set=utf8 



JDBC Driver URL 
jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=UTF8 



현제 문자셋 정보 보기 
show variables like 'c%'; 

- 결과 

character_set_client : utf8 
character_set_connection : utf8 
character_set_database : utf8 
character_set_results : utf8 
character_set_server : utf8 
character_set_system : utf8 
character_sets_dir : /usr/share/mysql/charsets/ 
collation_connection : utf8_general_ci 
collation_database : utf8_general_ci 
collation_server : utf8_general_ci 



이미 생성된 DATABASE의 문자셋 바꾸기 
mysql> SET character_set_client = utf8; 
mysql> SET character_set_results = utf8; 
mysql> SET character_set_connection = utf8; 
mysql> ALTER DATABASE [DB명] DEFAULT CHARACTER SET utf8; 



이미 데이터가 들어간 테이블의 문자셋 변환 
create table test (merong varchar(20) collate latin1_general_ci); 

이렇게 만들어진 테이블에 한글 데이터를 넣은 후 필드를 euckr 로 변경하려면 
다음처럼 해야 합니다. 

alter table test modify merong binary(100); 
alter table test modify merong varchar(20) collate euckr_korean_ci; 

binary 로 바꾸면 문자셋 특성이 사라지기 때문에 이런 변환과정을 거쳐야 
합니다(메뉴얼에 의하면). 그냥 바꾸면 문자들이 손상됩니다. 


[출처] http://rayis.egloos.com/841786


기존 EUC-KR 데이타를 4.1.x로 옮기기 
=================================== 
4.1.1 alpha 에서 한글 제대로 설정하기 
mysql이 4.1로 업그레이드 되면서 서브쿼리가 지원되게 되어 

아마도 많은 사람들이 개발시점에서 한 번쯤은 mysql4.1을 사용할지 

고민했으리라 생각합니다. 

그러나 아직 제대로된 버전이 아닌관계로 버젓한 메뉴얼이 없어 

변화된 localization셋팅때문에 많은 분들이 고생했을 것이라 예상합니다. 



mysql4.1에서는 4.0에서처럼 default character set하나만 바꿔주면 끝나질 

않습니다. 서버/데이터베이스/테이블/connection/ 심지어 필드 

하나하나, 스트링 하나하나까지도 character set과 collation을 설정할 수 

있게 되었습니다. 그래서 4.0에서 서비스하던 사이트를 4.1로 

데이터를 옮기는 과정에서 한글이 깨지는 현상이 발생합니다. 



쉽게 말씀드리면 4단계에 걸쳐서 각각 character set과 collation을 

변경해주시면 됩니다. 우선 데이터베이스를 다음과 같이 새로 생성합니다. 



>> create database DB_NAME character set euckr collation euckr_korean_ci 



그리고 4.0의 데이터를 스크립트로 복사한 다음 각각의 테이블 끝에 

붙어있는 character set을 euc-kr 이나 latin1에서 euckr로 변경해줍니다. 

(4.1에서 한글의 character set이름이 euc-kr에서 euckr로 변경되었습니다.) 



그런 다음 mysql 을 --default-character-set=euckr --default-collation=euckr_korean_ci 의 옵션을 주어 실행시키면서 자료를 덤프받습니다. 



>> mysql -uroot -p --default-character-set=euckr --default-collation=euckr_korean_ci < DB_SCRIPT.SQL 

(DB_SCRIPT.SQL파일은 4.0에서 받은 데이터 스크립트파일이겠죠.) 



그렇게 하면 일단 데이터베이스 어필리케이션(예를 들면 SQLyog같은 프로그램)에서는 정상적으로 데이터를 볼 수 있을 것입니다. 

하지만 JDBC를 사용해서 접속하는 경우 connection characterset을 따로 

설정해주지 않으면 한글이 깨질 것입니다. 

저같은 경우 어플리케이션에서 connection을 얻어오는 즉시 

해당 connection을 이용하여 "SET CHARACTER SET euckr"이란 

SQL명령을 executeUpdate 시켰서 해결했습니다만 아마도 더 깔끔한 

방법이 있을 줄 압니다. 



그렇게 하면 mysql4.1.1알파에서도 한글을 문제없이 사용할 수 있습니다. 

참고로 그냥 latin1으로 설정한 상태에서도 한글이 사용이 가능하긴 합니다만 order by나 일부 한글로의 검색시에 제대로 검색이 안되는 경우가 발생합니다. 그런 경우 해당 필드만 character set을 설정해서 사용할 수도 있습니다. 예를 들면 latin1으로 저장된 한글을 euckr의 코드셋 순서로 정렬하고 싶을 때 다음과 같이 하면 됩니다. 



>> SELECT * FROM table_name ORDER BY k COLLATE euckr_korean_ci 



그러면 한글 순서로 정렬이 됩니다. 

이 말은 만약 이제까지 latin1으로 잘 써오신 분이라면 정렬을 위해서만 추가적으로 코드를 추가해줄 경우 문제없이 잘 정렬이 됨을 의미하는 것이니 데이터베이스를 통째로 수정할 필요가 없겠지요.
 



출처: http://openlife.tistory.com/306 [물고기 많은 바다]