PHP에서 자주 발생하는 문제중 하나가 바로 문자 인코딩에 문제가 발생하여 한글이 깨지는 현상이다. 이런 문제는 매우 자주 발생하면서 어디서 문제가 발생하였는지 해결하기가 쉽지 않다. 아래는 이런 문자 인코딩 문제를 해결하기 위한 방법 중 하나로 SQL상에서 저장된 문자 자체가 깨지는 경우를 해결하기 위한 방법이다. 

일단 문자가 깨져서 나타나면 인코딩을 설정하는 다양한 환경에 모든 의심을 가져봐야한다. 가장 기본적으로 브라우저에 전달하는 html의 meta 태그charset 값을 확인할 필요가 있고 그 다음으로 PHP 서버언어의 인코딩 설정값 확인이 필요하다. 마지막으로는 SQL 데이터베이스에 생성된 테이블이 올바른 문자인코딩을 가지고 있는지의 여부이다.

한글 문자는 기본적으로 UTF-8을 대부분 사용한다. 위 사항들이 모두 UTF-8 또는 설정한 인코딩값이 정상적으로 설정되었음에도 불구하고 문제가 발생할 경우... 그리고 SQL에 저장된 값이 깨져있는 경우 우선 다음의 명령어를 사용해 PHP에서 서버로 전달하는 인코딩값의 환경설정을 확인할 필요가 있다. 일단 이를 확인하기 위해서 페이지에 다음의 값을 넣어 출력한 뒤 확인을 해보자. 아래의 코드를 데이터베이스 $dbc를 설정한 뒤에 위치시킨다.

<?php
   $dbc = '...';   //   데이터베이스 인증 설정변수
   echo mysqli_character_set_name($dbc);   //   문자인코딩 확인할 함수 실행
?>


만약 위의 출력값이 우리가 생각한 utf8이 아닌 경우 이를 해결하기 위하여 mysqli_set_charset() 함수를 사용해 mysql의 charset을 설정하는 코드를 추가할 필요가 있다. 아래의 방법을 참고하자.

<?php
   mysqli_set_charset($dbc, 'utf8');
?>

이 명령어는 mysql에 저장된 charset을 utf8로 변경해준다. 이 코드를 추가한 후 다시 데이터베이스를 확인해보자. 아마 깨지던 한글이 정상적으로 저장된 모습을 볼 수 있을 것이다. 또 다른 방법으로는 MySQL 설정을 수정하는 것도 존재한다. mysql의 환결설정에서 아래의 코드를 추가하는 것이다.

skip-character-set-client-handshake


아래의 코드를 추가하는 것도 클라이언트 문자셋 설정이 가능하다.

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8


이 경우 php에서 전달된 charset은 무시되고 설정된 sql charset을 사용하게 되어 문제가 해결된다. 하지만 이를 수행하기 위해서는 먼저 my.ini 또는 my.cnf에 접근해야 해야만 가능하다. 해당 파일에 접근하기 위해서는 파일의 위치를 알아야하는데 이를 찾기 위한 방법으로 쿼리를 사용하는 방법이 있다. 쿼리에 아래 명령어를 실행한다.

SHOW VARIABLES WHERE Variable_Name LIKE "%dir"

스크린샷) 출력된 설정값 위치

위 결과로 다양한 변수들의 위치가 나타나는데 여기서 MySQL의 위치 역시 확인할 수 있다. 참고로 호스팅을 사용한 공유 SQL의 경우에는 해당 위치에 접근하지 못하는 경우가 많을 것이다. 그렇기 때문에 위에 처음 언급한 방법대로 mysqli_set_charset()을 가장 쉽고 간단하다.