웹모아
웹모아[손님] 검색   로그인 / 회원가입    



 
애러처리
 


mysql 한글문자중 &#로 변환되는 문자 처리 (펌)
  2009-01-21 23:09:09 댓글:(0)   조회:2044



참고 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=44659 
몇달전에 위의 글을 남긴적이 있는데. 최근 회사에서 mysql4.1.10a에서 mysql 5.0.24a 로 업그레이드를 해야하는 문제에 직면하였습니다. 

저희회사는 컨텐츠 업체이다 보니, 데이타가 좀 많습니다. 전체가 약 10Gbyte 정도 되죠. 
이러다 보니, 단순히 mysql 버전업을 하는것이 아니라 이것저것 고려해야할게 많습니다. 

mysql 5를 이용하기 위해 처음에는 단순히 설치를 해 보았습니다. 

./configure --prefix=/home/server/mysql  
--with-charset=euckr  
--with-language=korean  
--localstatedir=/home/server/mysql/data  
--datadir=/home/server/mysql/data  
--without-readline 

그리고 dump를 떠서 모든 데이타를 넣었죠.. 

저회는 아파치에서  AddDefaultCharset ks_c_5601-1987 으로 설정하여 돌립니다. 
euckr은 특정 문자들(븕, 곂, 슝 등..)이 서브밋시 &# 로 변경되어 버리는 현상이 있기 때문에 이 문자셋을 이용합니다. 

그런데 문제는 mysql에서 insert into test (a) values ('븕 가'); 라는 query문을 실행하고 select를 해 보면.. 
데이타가 들어가지 않는 현상이 발생한 것입니다. 자료를 찾아보니 euckr 설정시 &#로 변환되게되는 글자들은 해당글자이하로 데이타가 잘리는 현상이 
발생하더군요. 대략 난감.. ㅡ.ㅡ 

그래서 이리저리 자료를 찾다보니 mysql 4.1.18 버전 이상부터인지 정확히는 모르겠으나, collation 이라는 개념이 생기면서 이전버전에서는 별도의 설정없이 잘되던 것이 오류가 발생하더군요.  이러 저리 자료를 찾다보니 utf8_general_ci 로 collate를 하면 입력된다는 말이 있더군요. 

============================= 

우선 다시한번 정리하면.. 


httpd.conf에서는 

AddDefaultCharset ks_c_5601-1987 

로 문자셋을 지정합니다. 다른 문자셋으로도 '븕', '곂' 등의 문자가 서브밋시 &#로 변환되지 않고 넘어가는 문자셋이 있으면 그걸 이용하셔도 됩니다. 



mysql에서는 위의 configure 처럼 설치하고, 
database, table, column 상에 collate를 하면 해결이 됩니다. 

mysql > create database test collate utf8_general_ci; 

위처럼 하면 test  database에서 별다른 문자셋 옵션없이 생성되는 모든 테이블, column은 utf8_general_ci 성향을 띠게 되고 
insert into testtbl (a) values ('븕 가'); 와 같은 문자열은 정상적으로 입력되는것을 확인하였습니다. 

하지만 문제점이 생기더군요. 

where (a, b) = ('a', 'b') 형태로 php에서 쿼리문을 날리니 에러가 발생합니다. 요는 문자셋이 틀린항목은 and로 조합하여 쿼리를 날릴수 없다는 겁니다. 대략 난감 .. ㅡ.ㅡ 저희사이트는 index가 생명이기에 조합인덱스를 자주사용합니다. 

해결방법을 찾고자 고심하던 끝에 index(a, b) 형태로 조합인덱스를 사용하는 column에는 collate euckr_korean_ci 를 설정하게 되면 이를 해결할 수 있다는 것을 알았습니다. 

create table testtbl ( 
  a varchar(10) not null collate euckr_korean_ci, 
    b varchar(10) not null collate euckr_korean_ci, 
    c varchar(10), 
    index(a,b) 
); 

위와 같이 설정하니 정상적으로 보여지네요. 

만약 테이블을 새로 생성할수 없다면 다음과 같이 하면 됩니다. 
alter table testtbl change a a varchar(10) not null collate 'euckr_korean_ci'; 
alter table testtbl change b b varchar(10) not null collate 'euckr_korean_ci'; 

그런데 이건 우째 잘 안되는것 같았습니다. 일단 한번 해보세요. alter하기전에 data 백업하는 습관 꼭~!! (예전에 그냥 alter 했다가 데이타의 반이 뚝딱 사라지는 경험을 하여 alter시에는 꼭 백업을 받아두고 합니다. ) 

이렇게 하면 database 생성시 그리고 table schema를 생성할때 기존에 비해 번거롭더라도 제대로 된 효과를 볼수 있습니다. 


아무튼 여차저차하여 mysql 5.0.24a 버전으로 업그레이드를 할 수 있을것 같습니다. 
혹시 저와 같은 문제로 고민하신분에게는 도움이 되었으면 좋겠네요.



 댓글 (0)


애러처리
페이지: 1 / 1   


   #1194 - Table is marked as 2304
   ERROR 1040 (08004): Too many3472
   ERROR 2002 (HY000)2121
   #1030 - Got error 134 from s2096
   REPAIR TABLE - 테이블 복구.2801
     [RE] REPAIR TABLE - 테이블 복구.1280
   Mysql 문자셋이 안맞는 경우 - mysql_er10224
mysql 한글문자중 &#로 변환되는 문자 처리 (2045
   도스용 dbf파일 vfp에서 띄울때 한글이 깨지는 1851
   mysql의 테이블이 깨진경우 검사 및 복구 하는 2082
   mysql 의 데이터를 NFS 로 연결해서 쓸때의 8433
   MySQL에러 유형별 대처방법10475
[1]  

복수단어 검색은 공백(space)로 구분해 주세요. 1





최근 글
[손님]

인기 글
[손님]
[깊은연못] 24시간 Classical Radio
[푸른산] 검색식
[홈마스타] setinterval 사용과 중지
[김준수] (1) 모의고사 풀이