최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰




2016.04.03 수정 - 내용추가[각주:1]



   APMSETUP7 'MySQL'에서 한글깨짐을 처리하기 위한 UTF-8 캐릭터셋 설정


기본값이 latin1 로 되어있다. 


DB와 출력 플랫폼간의 인코딩이 서로 다른경우 속성(인코딩) 명령어를 일일이 명령어로 지정하여 사용해야 하기 때문에,


매우 번거롭다. 따라서 mysql의 인코딩 설정은 어떤 의미로는 필수적인 단계이다.


* 참고로 기본값인 latin1으로 그냥 사용할 경우 다음과 명령어를 사용하면 UTF-8로 변경이 된다. 


 ( 그런데 ALTER 쿼리 자체가 참 귀찮고... )


ALTER DATABASE 데이타베이스_이름 CHARACTER SET utf8 COLLATE utf8_general_ci;     //DB


ALTER TABLE 테이블_이름 CHARACTER SET utf8 COLLATE utf8_general_ci;     //TABLE


(혹은 DB를 만들면서 지정)


CREATE DATABASE 데이타베이스_이름 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;




   나의 SQL 캐릭터셋 리스트 보기


윈도우키 + R 을 누른뒤 > cmd 를 입력하여 도스 커맨드 창을 뛰운다.


기본 비번은 root / apmsetup 이니 알아두도록 하고 다음과 같이 mysql에 접속한다.


C:\> mysql -uroot -papmsetup


mysql> show variables like 'c%';   를 입력하면 현재 적용되어있는 캐릭터셋이 아래와 같이 리스트로 뜬다.



살펴보면 캐릭터셋의 설정이 모두 latin1 로 되어있다.


문제점1) phpAdmin같은 편리한 관리 도구로 테이블에 입력된 값을 살펴 볼 경우 한글이 죄다 ????으로 떠서 확인이 불가.


문제점2) 게다가 php로 select로 결과값을 받을때에도 @mysql_query('set names utf8')', 일일이 iconv() 메서드로 계속 인코딩을 


             관리해서 입/출력 해야한다.


문제점3) 위에 설명했듯이 ALTER로 속성을 바꿀수는 있지만... 이미 캐릭터가 입력되어서 서로 다른 타입이 테이블에 혼재할경우


            이래저래 엄청 일이 꼬이게 된다.



   my.ini 파일 수정


1. C:\APM_Setup\Server\MySQL5\data 에서 my.ini 파일을 편집기로 오픈한다.


  ↓ 이렇게 생긴 파일 맞다.



2. 정확히 "[항목의]" 내용을 찾아서 다음의 문자열을 추가한다.


[client]

default-character-set=utf8


[mysqld]

init_connect=SET collation_connection = utf8_general_ci

init_connect=SET NAMES utf8

default-character-set=utf8

character-set-server=utf8

collation-server=utf8_general_ci


[mysql]

default-character-set=utf8



3. 저장이 되었으면 현재 my.ini파일을 복사하여 APM_setup\Server\MYSQL5에 붙여넣기 한다.


그러면 


C:\APM_setup\Server\MYSQL5\data 폴더에 my.ini 한개 존재


C:\APM_setup\Server\MYSQL5 폴더에 my.ini 한개 존재 


이렇게 총 두개의 my.ini가 존재 할 것이다.


data 하위에 my.ini가 없으면 APMSETUP모니터가 작동하지 않기때문에 이렇게 조치 하는것이다.




4. 수정이 끝났으면 mysql을 재시작 해야 하는데


ㄱ. APM프로그램에서 stop을 누른뒤 다시 Start를 누르거나 (추천)


ㄴ. mysql> quit; 


    c:\>mysqladmin -uroot -papmsetup reload    라는 커맨드로 입력해도 된다.





   캐릭터셋 변경 확인


수정이 잘 되었는지 반드시 확인해야 한다.


C:\> mysql -uroot -papmsetup   mysql에 로그인한 뒤


mysql> show variables like 'c%';   명령어를 치면 아래와 같이 전부 utf8로 잘 변경되어져있다.





   mysql설정에서만 끝난게 아니라 php에서 DB연결 설정시 mysql_set_charset 사용하여 클라이언트 캐릭터셋을 

   반드시 지정해준다.


bool mysql_set_charset ( string $charset [, resource $link_identifier = NULL ] )




mysql_set_charset — Sets the client character set


Sets the default character set for the current connection.



* Parameters


chartset 에서는 사용할 캐릭터셋 이름이 들어가고,


link_identifier 에는 MySQL 커넥션을 지정해준다. 만약 지정되어 있지 않으면 마지막으로 연결된 링크가 적용된다.




NotePossible UTF-8 confusion

Because character set names in MySQL do not contain dashes, the string "utf8" is valid in MySQL to set the character set to UTF-8. The string "utf-8" is not valid, as using "utf-8" will fail to change the character set.


MySQL 캐릭터 설정에는 하이픈을 포함하면 안된다. 

"utf8" 로 표현해야 맞지 "utf-8"을 쓰면 맞지 않는 표현이며 캐릭터셋 설정에 실패할 것이다.




소스로 보면 다음과 같다.


<?
	@header("Content-type:text/html;charset=utf-8");
	
	$host = "localhost";
	$id = "root";
	$pw = "apmsetup";

	$connect = mysql_connect($host, $id, $pw);
	if(!$connect) die ( 'DB접속 실패'.mysql_error() );

	mysql_set_charset("utf8", $connect);
	
	$DB_NAME = "board_db";
	$db_select = mysql_select_db($DB_NAME, $connect);
	if( !$db_select) die ("Can\'t use ".$DB_NAME.": ". mysql_error());
?>


11번 라인 : mysql_set_charset("utf8", $connect);  로 db커넥션에 "utf8"로 지정해준다. 매우중요.





   이후 데이터 값의 확인은 phpMyAdmin 에서


http://localhost/myadmin/index.php 에 접속하면 아래 처럼 SQL 관리 도구가 뜬다.


역시 비번과 이이디는 root / apmsetup 으로 동일하다.


앞으로의 데이터베이스 열람은 cmd에서 명령기반의 모니터링이 아니라 phpMyAdmin으로 확인하는것이 정신에 매우 이로울것이다.




ps. 캐릭터셋 때문에 하도 고생을 해서 10번 이상의 임상실험을 통해 계속해서 반복적으로 성공한 구성을 튜토리얼로 기록 남겨둔다.

   

       2~3시간 삽질한 것 같은데 "euc-kr / utf-8" 도 아니고 하필 latin1 이라니... 이래저래 다른 유저들도 참 많이 고생 할 듯.









2015.02.02 내용추가.



   그러나 반전이 있다.


phpMyAdmin 3.2.3 버전, MySQL 5.1.41에서는 MySQL 문자셋 변경 접근 자체가 안된다.





그런데 phpMyAdmin 2.6.1 버전의 MySQL 5.1.61버전에는 친절하게 셀렉트 박스로 변경할 수 있다.


(어떤 버전을 패치해야 아래와 같이 변경되는지는 나중에 포스팅 하겠다.)






  1. mysql설정에서만 끝난게 아니라 php에서 DB연결 설정시 mysql_set_charset 사용하여 클라이언트 캐릭터셋을 반드시 지정해준다. [본문으로]
댓글