로컬APM(윈도우)에서 mysql 서버로 접속해서 사용시 글자가 깨진다.

1 minute read

  • 현상
  • MySQL 서버 : 4.1이상, euc-kr을 기본으로 사용
  • 4.0 이하에서는 문제없음.

  • 웹서버(리눅스) + MySQL 서버 => 정상 동작
  • $sql = “show variables like ‘%character%’”;
  • 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/local/mysql/share/mysql/charsets/

  • 로컬PC(윈도우+APM) + MySQL 서버 => 글자가 깨진다.
  • $sql = “show variables like ‘%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/local/mysql/share/mysql/charsets/

  • 해결 방법
  • mysql_set_charset($charset); 함수로 사용언어셋을 설정한다. (PHP 5 >= 5.2.3)
  • 위 함수가 지원 안될 경우
    mysql_query(“SET NAMES {$charset}”);
    을 대신 사용. 
    ($charset : 설정할 언어셋)

  • 문제 원인
  • 웹 서버(리눅스)에서 $ php -i grep mysql 를 하였을 때 로컬 PC와의 차이점.
  • MYSQL_SOCKET => /tmp/mysql.sock
    MYSQL_INCLUDE => -I/usr/local/mysql5/include/mysql
    MYSQL_LIBS => -L/usr/local/mysql5/lib/mysql -lmysqlclient 
  • MYSQL_INCLUDE 쪽에 가서 확인해보니
    my_config.h 라는 파일 속에서
    /* Define to enable charset euckr /
    #define HAVE_CHARSET_euckr 1
    /
    Define the default charset name /
    #define MYSQL_DEFAULT_CHARSET_NAME “euckr”
    /
    Define the default charset name */
    #define MYSQL_DEFAULT_COLLATION_NAME “euckr_korean_ci”
    이 부분 들이 보임.
  • 즉, MySQL 을 설치할 때 기본 언어셋을 지정하여 설치하였음.
    그 MySQL을 PHP에서 사용함. 그래서 기본으로 euckr로 접속됨.

  • 로컬PC(윈도우+APM)에서는 위와 같은 내용이 안보임
  • WAPM(windows+APM) 에서는 MySQL관련 클라이언트가 설치 안되어있어도 PHP에서는 MySQL로 접속 할 수 있다.
  • 즉, PHP의 MySQL관련 파일(아마도 php_mysql.dll?)에서 위와 같은 기본 언어셋을 euckr로 설정안하고 dll파일이 만들어져서 문제가 생긴다.

🔗original-link

Updated: