ERROR Message [ Illegal mix of collations …]의 해결방법

참으로 오랜 만에 올리는 글이다.
이번에는 거의 일년도 넘게 골치거리로 남아있던 문제점을 해결한 방법을 기록해본다.

이 에러는 그동안 닷홈 서버에서 해결하지 못했던 한글깨짐의 원인을 제공하는 부분이었는데,  DB connection error 구문을 그 동안 꺼놓고 있었던 탓에 발견하지 못한 점도 있고 코딩을 하지 않고  워드프레스를 그저  자체로  이용만 하던 상황에서는 만날 수 조차 없던 것이었기 때문에 이제서야 해결방법을 알 수 있게 된 점도 있다.

근래들어서 는 ‘문자 셋’을 utf-8으로 설정하게 되면 영문이든 한글이든 심지어는 한자인 경우에라도  대부분의 경우에 화면깨짐이 없이 잘 구현되는것이 일반적이지만 몇몇 특수한 경우에는 그 원인을 쉽게 알 수 없는 ‘한글깨짐’ 현상을 만나게 된다.

필자의 경우도 그 중의 한 종류라고도 볼 수 있다.

[ 현 상 ]

DB에서 특정필드를 읽어와서 php 코드의 특정변수와 비교하는 쿼리구문을 실행시킨 것인데..아래와같은 에러 메시지를 만났다.
” Error:?? Illegal mix of collations (utf8_general_ci,IMPLICIT) and (euckr_korean_ci,COERCIBLE) for operation ‘=’ ”

sql 쿼리구분을 출력해보니 에러가 나는 위치에서 한글이 포함되어있었다.   분명히  mySQL DB세팅을 utf8_general_ci 로 되어있고, php 코드도 utf8 로 변환하여 업로드했는데..이런 에러가 뜨는것을 납들할수없었다.
하지만  에러가 발생하는 ‘필드’를  euckr_korean_ci,로 변경하면 에러가 나타나지않는 것으로 봐서는  php 코드 부분에서 한글을 아파치 서버가  euckr_korean_ci 로 해석하는 것이 확실했다.

하지만 문제는 이렇게 두면 코드를 실행한 후에 화면의 한글부분이 모두 깨져 나온다는 것이다.  분명한 것은  현재의 아파치 서버 세팅이 ‘euckr’이므로  ” 어떻게 하면 이것을   ‘utf8’ 으로 바꿀것인가?” 가 관건이다.

과거의 기억을 되살려 보면 닷홈서버의 경우에는 ‘.htaccess’ 셋팅에서도  문자셋에 대한 설정이 있었던 것 같아 그 곳부터 살펴보았다.

<IfModule mod_url.c>
checkURL On
# ServerEncoding UTF-8
# ClientEncoding euckr
</IfModule>

하지만 이건 주석 처리된 것이므로 문제가 없을듯… 하지만 혹시 모르니   ClientEncoding 을  UTF-8로 바꾸고 주석 처리를 지워 보았다. 역시 별무 소득도 없다.
이제 에러 메시지를 긁어서 구글링 해본다.  수도 없는 내용의 글이 뜬다.

이것들을 열심히 찻아 다니면서 읽어보고 어느 정도 소득을 얻게되었다.

1. 아파치 서버 설정 :  (httpd.conf 에서)
AddDefaultCharset UTF-8

2. PHP 설정 변경 :(php.ini 에서)
default_ = “UTF-8”
output_handler = mb_output_handler

[mbstring]
mbstring.language = UTF-8
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;
[PHP_MBSTRING]
extension=php_mbstring.dll

3. mySQL 설정 변경( my.cnf 파일에서 )

[client]
default-character-set = utf8

[mysqld]
character-set-client-handshake=FALSE
init_connect=”SET _connection = utf8_general_ci”
init_connect=”SET NAMES utf8″
character-set-server = utf8
-server = utf8_general_ci

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

4. PHP 코드 내부 에서  ( 반드시 모든 파일은 UTF-8로 만들어 저장한다.)

1) HTML 파일 내부에서:
meta http-equiv=”Content-Type” content=”text/html; =UTF-8″

2) XML 파일내부에서 :  xml version=”1.0″ encoding=”UTF-8″

3) css 파일에서 :  @ “utf-8”;

4) 서버에 지정된 문자셋을 무시하고 새로 지정 하는 방법 : php  header(“Content-Type: text/html; =UTF-8″);

5) javascript 에서 : <script> type=”text/javascript” src=”path/file.js” =”utf-8″</script>

하지만 이것들은 대부분 서버를 직접 운용하는 경우에 적용 가능한 것 들이어서 적용해보았지만 대부분이 별무 소득도 없다.

5. 마지막 방안

마지막 4) 번의 경우는 그래도 서버세팅을 무시하고 새로 지정하는 방법이므로 내가  시도해 볼 수 있는  것이다.이런 코드를 넣으면 된다고 되어있는데…

내 경우에는 이것으로 해결이 가능했다.

소셜댓글

Loading Facebook Comments ...
Loading Disqus Comments ...

No Trackbacks.