최신 게시글(DB)
2017.03.13 / 13:41

PHP php, mysql 웹에서의 한글 깨짐현상 - WEB서버와 DB 와 인코딩이 다를때

Mans
추천 수 151

서버간의 인코딩이 다를 경우 : 인코딩을 맞추는 방법

OS , 파일 시스템의 character set : UTF-8

Web Server 의 기본 인코딩 : iso-8859-1  , 

DB Server 기본 인코딩 : euc-kr


웹에서의 한글 깨짐 현상 


MySQL을 이용하여 DB를 구성하고, php와 연동하여 출력을 확인해 보려 했다. 

따라서, 다음과 같은 소스를 코딩하였다. 


<?php // query.php

require_once 'login.php';

$db_server = mysql_connect($db_hostname, $db_username, $db_password); 


if(!$db_server) die ("Unable to connect to MySQL :" . mysql_error());


mysql_select_db($db_database) or die("Unable to select Database : " . mysql_error());


$query = "SELECT * FROM temptest" ; 

$result = mysql_query($query) ; 


if(!$result ) die ( "Database access failed  : "  . mysql_error());


$rows = (mysql_num_rows($result)); 


for($j = 0 ; $j < 5 ; ++$j){

$temp = mysql_result($result, $j, 't2'); 

print("$temp <br>"); 

}

?> 


당연히 되겠지 하고 웹에 접속해봤는데 이게 무슨일?? 




한글이 모두 ??? 로 표시된다. 

이유를 생각해보니 웹에서의 인코딩과, MySQL상에서의 인코딩이 달라서 쿼리로 넘어와서 출력될때 깨지는것 같기도 한데.... 그래서 방법을 찾아 봤다. 




  문제 해결


1. 인코딩 방식을 통일 (코딩 페이지, 웹 형식 모두 utf8로 통일) 

결론은 소용없었다. 여전히 한글이 깨져서 ????로 표시 된다. 

php 문서의 인코딩 형식도 통일해야 된다고 해서 했는데도 안된다. 


2. iconv() 사용하기 

이문제로 인해 방법을 찾아봤을때 인터넷에서 해결방법이라고 가장 많이 나온 것이 iconv()함수를 사용하는 것. 

사용법은 다음과 같다. 


iconv("현재 인코딩", "바꿀 인코딩", 바꿀 스트링) 


따라서 저 함수를 이용하여 다음과 같은 소스를 추가한 후 출력해봤다. 


$temp = iconv('utf8', 'euckr', $temp);


물론 1번을 하면서 모든 인코딩을 utf8로 통일 했지만...혹시나 해서 euckr과 cp949로 바꿔서 다해봤지만...

안된다. ㅠㅠ


3. MySQL 입출력 인코딩을 지정 

이것이 답이었다. 입출력시 인코딩 형식이 달라서 그런 것이었는데. 이것을 해결하는 방법을 겨우겨우 찾을 수 있었다. 


자세한 설명은 푸른새벽님의 블로그에서 찾을 수 있었다. 


http://sdcho7.egloos.com/2518559


결국 다음과 같은 소스를 추가함으로써 해결했다. 


<?php // query.php

require_once 'login.php';

$db_server = mysql_connect($db_hostname, $db_username, $db_password); 


if(!$db_server) die ("Unable to connect to MySQL :" . mysql_error());


mysql_select_db($db_database) or die("Unable to select Database : " . mysql_error());


mysql_query("set session character_set_connection=utf8;");

mysql_query("set session character_set_results=utf8;");

mysql_query("set session character_set_client=utf8;");


$query = "SELECT * FROM temptest" ; 

$result = mysql_query($query) ; 


if(!$result ) die ( "Database access failed  : "  . mysql_error());


$rows = (mysql_num_rows($result)); 


for($j = 0 ; $j < 5 ; ++$j){

$temp = mysql_result($result, $j, 't2'); 

print("$temp <br>"); 

}


참고로 utf-8 하면 안된다. utf8해야 함




흙흙 이틀 삽질만에 해결했다 ㅠㅠㅠ



* 보통 이런 부분은  db.class.php  와 같은 파일에 추가 수정


  <?


/**

 * MySQL class

 */


class DB

{

var $db_host, $db_user, $db_pass, $db_conn;

var $count;


function DB($iniFile)

{

include $iniFile;

$this->db_host = $db_host;

$this->db_user = $db_user;

$this->db_pass = $db_pass;

$this->connect($db_name);

}


function connect($db_name="")

{

$this->db_conn = @mysql_connect($this->db_host, $this->db_user, $this->db_pass);

if (!$this->db_conn){

$err['msg'] = 'DB connection error..';

$this->error($err);

}

if ($db_name) $this->select($db_name);

}


function select($db_name)

{

$ret = mysql_select_db($db_name);

if (!$ret){

$err['msg'] = 'DB selection error..';

$this->error($err);

}

}


function query($query)

{

$time[] = microtime();

//by aceofcom character set  webserver euckr   dbserver - utf8  database euc-kr

mysql_query("set session character_set_connection=euckr;");

mysql_query("set session character_set_results=euckr;");

mysql_query("set session character_set_client=euckr;");


$res = mysql_query($query, $this->db_conn);

if (preg_match("/^select/",trim(strtolower($query)))) $this->count = $this->count_($res);


if (!$res){

$debug = @debug_backtrace();

if($debug){

krsort($debug);

foreach ($debug as $v) $debuginf[] = $v['file']." (line:$v[line])";

$debuginf = implode("<br>",$debuginf);

}


$err['query'] = $query;

$err['file'] = $debuginf;

$this->error($err);

}


$time[] = microtime();

$this->time[] = get_microtime($time[0],$time[1]);

$this->log[] = $query;


if ($res) return $res;

}


function fetch($res,$mode=0)

{

if (!is_resource($res)) $res = $this->query($res);

return (!$mode) ? @mysql_fetch_array($res) : @mysql_fetch_assoc($res);

}


function count_($result)

    {

        $rows = mysql_num_rows($result);

        if ($rows !== null) return $rows;

    }


function close()

    {

        $ret = @mysql_close($this->db_conn);

        $this->db_conn = null;

        return $ret;

    }


function error($err)

{

//msg("정상적인 요청이 아니거나 DB에 문제가 있습니다",-1);

echo "

<div style='background-color:#f7f7f7;padding:2'>

<table width=100% border=1 bordercolor='#cccccc' style='border-collapse:collapse;font:9pt tahoma'>

<col width=100 style='padding-right:10;text-align:right;font-weight:bold'><col style='padding:3 0 3 10'>

<tr><td>error</td><td>".mysql_error()."</td></tr>

";

foreach ($err as $k=>$v) echo "<tr><td>$k</td><td>$v</td></tr>";

echo "</table></div>";

//exit();

}


function viewLog()

{

echo "

<table width=800 border=1 bordercolor='#cccccc' style='border-collapse:collapse;font:8pt tahoma'>

<tr bgcolor='#f7f7f7'>

<th width=40 nowrap>no</th>

<th width=100%>query</th>

<th width=80 nowrap>time</th>

</tr>

<col align=center><col style='padding-left:5'><col align=center>

";

foreach ($this->log as $k=>$v){

echo "

<tr>

<td>".++$idx."</td>

<td>$v</td>

<td>{$this->time[$k]}</td>

</tr>

";

}

echo "

<tr bgcolor='#f7f7f7'>

<td>total</td>

<td></td>

<td>".array_sum($this->time)."</td>

</tr>

</table>

";

}

}


?>