since 1997

오늘 121 / 전체 478,101

CATEGORY

분류 전체보기 (637)
일상다반사 (235)
끄적끄적 (20)
음악이야기 (14)
$잡다구리 (60)
$운영체제 (129)
$프로그래밍 (148)
$데이터베이스 (31)
RECENT ARTICLES

  Distributed VCS

  Windows 7 - Reset win..

  티맥스소프트가..

  결국 티맥스소프..

  오늘, 그리고 내..

  라데온 4890

  Vincent Baguerre, Aur..

  Jetbrains IntelliJ ID..

  ERwin r7.3.3

  썬을 인수한 오라..

RECENT COMMENTS

  답변이 많이 늦었..

  저도 ?????로깨지..

  저거 나한테 버려..

  잘 보고 가요...

  안녕하세요..ERWi..

  고맙습니다. 잘쓰..

  몇달후 가상 fdd ..

  감사합니다..좋은..

  한큐에 해결 감사..

  한큐에 해결 감사..

RECENT TRACKBACKS

  Vista vmware로 인스..

  첫번째 포스팅입..

  Windows Vista Beta 1,..

  패킷 필터링과 방..

ARCHIVES

  2010년 08월

  2010년 07월

  2010년 05월

  2010년 02월

  2009년 08월

FAVORITE SITES

  ASP.NET

  BeautifyKoreanFonts

  BigAdmin HCL: Sun Dev..

  BitTorrent Linux Mirr..

  CentOS Linux

  DHS International

  DistroWatch.com

  eady.sarang.net

  Enlightenment Project

  EveryDNS

  glassfish : j2ee web ..

  GUI Linux

  iamyhs

  IETF

  Intel PRO/Wireless 39..

  Java SE Development K..

  Java SE Runtime Envir..

  JavaServiceNet

  JBoss 관리자 개발..

  miniwini.com

  MS Express Edition Pr..

  Netcraft

  PC-BSD

  PHP Snapshots

  Port Scan

  Programmer를 꿈꾸며..

  PSOUG Oracle Morgan&#..

  Solaris Operating Sys..

  SSH Secure Shell

  UANAX Organization

  USA LUG

  WhiteBox Linux

  [Bossa Nova] Chili Mu..

  [Bossa Nova] Chili Mu..

  네트워크 전문지..

  코리아인터넷닷..

  한국 데비안 사용..















  Get Firefox!
HOME RSS XML GUESTBOOK SERVICE ABOUT ADMIN
PREV | 1 ... 292 293 294 295 296 297 298 299 300 ... 637 | NEXT
MySQL 4.1 + PHP 웹브라우저에서 한글 깨지는 문제해결 | $운영체제 - Posix
기본적으로 mysql 4.1의 서버와 mysql(client) 에서 한글 (euckr로가정)을 제대로 입출력하기 위해서는 몇가지 설정이 필요합니다.
(특히 옛날에 character set을 db자체에 저장하지 않던 구조의 database를 가지고있는경우 더욱 그렇습니다.MySQL  메뉴얼에보니 이경우 )
 
제 환경은 Redhat 7.3 , MySQL 4.1.8 (RPM),PHP 5.0.3,Apache 1.3.33 입니다.
 
4.1에서 설정파일이 /etc/my.cnf 라고 가정합니다.
 
[client]
[mysqld]
[mysqldump]
 
위 3 세션에 모두
default-character-set=euckr
이라는 내용을 있으면 놔두고 없으면 추가해주십시요. 다른 언어로 되어있다면 그부분만 euckr 로 수정하시면 됩니다.
참고로 4.1부터는 euc_kr에서 euckr로 바뀌었습니다.
 
db에 character set 정보가 저장되지 않았던 시절에 만들어진 db들의 경우 위의 설정을 바꾸께되면 database 의 코드가 바뀌어 버리게 됩니다. 그러니 이전에 사용하던것과 일치시켜 주셔야 합니다.
 
일단 이렇게까지만하면 콘솔에서 mysql 을 실행하여 접속해서 한글을 읽고 쓰는대는 별문제가 없으실 것입니다. 그러나 제경우 문제는 이뒤부터 발생했습니다.
웹에서 출력하는 페이지들중 db에서 불러오는것들이 ASCII 가 문자들의 경우 모두 ? 로 깨어저 나오는 것입니다.
 
그래서 직감적으로 character set에 관련된 문제란건 알겠는데 이것을 확인하는 방법부터 말씀 드리면
 
shell에서
mysql dbname -e 'show variables like "%character%"; show variables like "%collation%";'
 
이렇게 입력해보시면 아마도 위의 3 세션 모두 정상적으로 수정해서 적용되었다면
( [mysqld]세션의 경우 mysql 서버 재시작 필요.dbname을 mysql 등으로 바꿔서 해주시기 바랍니다.)
이렇게 나올 것입니다.
 
 

























Variable_name Value
character_set_client euckr
character_set_connection euckr
character_set_database euckr
character_set_results euckr
character_set_server euckr
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/














Variable_name Value
collation_connection euckr_korean_ci
collation_database euckr_korean_ci
collation_server euckr_korean_ci

 
그러나 shell에서 실행하는 client의경우 [client] 세션의 영향을 받는데 (다른 character set으로 바꾸면서 실행해보시면 확실히 아실 수 있습니다.)
 
웹에서 php를 이용하여 접속한것들은 적용이 안되는것을 확인햇습니다.
확인하는 코드는 아래와 같습니다.
 
show variables like "%character%";show variables like "%collation%";
 
이것을 브라우저를 통해 실행해서 실제로 php를 이용한 접속에서 도대체 character 에 어떤 문제가 발생하는지 볼수 있습니다.
 
실행결과는 아래와 비슷할 것입니다.

character_set_client | latin1
character_set_connection | latin1
character_set_database | euckr
character_set_results | latin1
character_set_server | euckr
character_set_system | utf8
character_sets_dir | /usr/share/mysql/charsets/

collation_connection | latin1_swedish_ci
collation_database | euckr_korean_ci
collation_server | euckr_korean_ci

 
character가 shell에서 실행할때와는 완전히 딴판인것을 눈으로 직접 확인할 수 잇습니다.
그럼 이것을 해결해야되는데 이것은
 
mysql 서버에 접속시
set session character_set_connection=euckr;
set session character_set_results=euckr;
set session character_set_client=euckr;

 
들을 실행하여 character set에 대한 정의를 다시 해주시면 됩니다.
 
자 순서대로 어던일이 일어나는지 봅시다.바로 위의 3가지 character set설정 명령없이 실행한경우와 비교해 보시기 바랍니다.
그럼 해당 설정들이 실제로 어떤 영향을 미치는지 이해하는데 도움이 될것입니다.
 
먼저 set session character_set_connection=euckr; 만 적용할 경우.
결과는 아래와같습니다. 3가지중 아무것도 적용안했을경우와 비교하면

character_set_client | latin1
character_set_connection | euckr    <== latin1 에서 euckr 로 변경됨.
character_set_database | euckr
character_set_results | latin1
character_set_server | euckr
character_set_system | utf8
character_sets_dir | /usr/share/mysql/charsets/

collation_connection | euckr_korean_ci    <== latin1_swedish에서 euckr로 변경됨
collation_database | euckr_korean_ci
collation_server | euckr_korean_ci
 
 
 
이제 set session character_set_results=euckr; 만 적용해 봅시다.
결과는 아래와 같습니다.3가지중 아무것도 적용안했을경우와 비교하면
 
character_set_client | latin1
character_set_connection | latin1
character_set_database | euckr
character_set_results | euckr      <== latin1 에서 euckr로 변경됨
character_set_server | euckr
character_set_system | utf8
character_sets_dir | /usr/share/mysql/charsets/


collation_connection | latin1_swedish_ci
collation_database | euckr_korean_ci
collation_server | euckr_korean_ci

이제 set session character_set_client=euckr; 만 적용해 보면 결과는
아래와 같습니다.3가지중 아무것도 적용안했을경우와 비교하면
 
character_set_client | euckr         <== latin1에서 euckr로 변경됨
character_set_connection | latin1
character_set_database | euckr
character_set_results | latin1
character_set_server | euckr
character_set_system | utf8
character_sets_dir | /usr/share/mysql/charsets/


collation_connection | latin1_swedish_ci
collation_database | euckr_korean_ci
collation_server | euckr_korean_ci

이제 3가지를 모두 한번에 적용해 봅시다.
set session character_set_connection=euckr;
set session character_set_results=euckr;
set session character_set_client=euckr;

결과는 아래와 같습니다.3가지중 아무것도 적용안했을경우와 비교하면

character_set_client | euckr                  <== latin1에서 euckr로 변경됨.
character_set_connection | euckr          <== latin1에서 euckr로 변경됨.
character_set_database | euckr
character_set_results | euckr                <== latin1에서 euckr로 변경됨.
character_set_server | euckr
character_set_system | utf8
character_sets_dir | /usr/share/mysql/charsets/


collation_connection | euckr_korean_ci    <== latin1에서 euckr 로 변경됨.
collation_database | euckr_korean_ci
collation_server | euckr_korean_ci

이제 원하시는대로 웹브라우저의 encoding 이 한국어로 되있을경우 안깨지는 정상적인 결과를 얻을실 수 있을 것입니다.
 
완전히 새로 만들고 다국어데이타의 입력도 고려한다면 unicode의 사용도 괜찮을듯 싶습니다.
 
 
위에서 php통하여 실행시키는 코드는 아래와 같습니다.
localhost로 접속하고 암호는 없으며 db계정을 root라 가정합니다.
 
//  php 프로그램의 시작
 <?

$connect    
= mysql_connect(localhost,root
);
$isResult    = mysql_select_db("mysql", $connect
);

// mysql_query("set session character_set_connection=euckr;");
// mysql_query("set session character_set_results=euckr;");
// mysql_query("set session character_set_client=euckr;");


$sql = "show variables like '%character%'"
;
$result = mysql_query($sql
);

while(
$row = mysql_fetch_array($result
)) {
    echo
$row[0] . " | " . $row[1] . "<br>
"
;
}

echo (
"<br><br>"
);

$sql = "show variables like '%collation%'"
;

$result = mysql_query($sql
);

while(
$row = mysql_fetch_array($result
)) {
    echo
$row[0] . " | " . $row[1] . "<br>
"
;
}

?>
// php 프로그램의 끝

 
프로그램을 붙여넣기 하여 파일로 저장한후 3가지 설정의 주석을 풀아가면서 또 모두 풀어서 테스트 해보시기 바랍니다.(굵게 표시된 부분)
 
 
혹시 내용상 오류가 있을지 모르구요, 참고로 system에 utf8의 경우 고정되어있는 값으로 변경 불가능 합니다.
TRACKBACKS  MESSAGES(2)  DATE 05/10/20 11:18
TRACKBACK ADDRESS : http://www.todayis.net/vSix/rserver.php?mode=tb&sl=480
저도 ?????로깨지는 문제가 발생되고잇는데 설명이 어려워서 어떻게 대처해야댈지모르겟네요...ㅠㅠ
www.000webhosting.com 이라는 외국 웹호스팅사이트 쓰고잇구요... 언어를 euckr_korean_ci 로바꿔야댄다는데 그걸어떻게하는지좀 쉽게설명좀부탁드려요 ㅠ
by Torres10/03/13 10:09 

답변이 많이 늦었네요. 호스팅을 받고 있다면 위의 방법은 별 의미가 없습니다. 매번 DB에 데이터를 넣고 뺄때 인코딩설정을 따로 하셔야 할듯 합니다.
by todayis10/06/12 02:30 

SECRET
NAME
PASSWORD
HOMEPAGE  
MESSAGE