로컬APM(윈도우)에서 mysql 서버로 접속해서 사용시 글자가 깨진다.
- 현상
- 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파일이 만들어져서 문제가 생긴다.