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 사용하여 클라이언트 캐릭터셋을 반드시 지정해준다. [본문으로]
Posted by SAP (Study And Programming) by serpiko

댓글을 달아 주세요

  1. 님이 킹왕짱 :)

    따라하니 정말 잘되네요! ㅎㅎ

    2014.09.15 21:59 [ ADDR : EDIT/ DEL : REPLY ]
  2. M_On

    요기 오타가 있으시네요~
    'mysql> show variables link 'c%';' <- link

    2014.09.15 22:03 [ ADDR : EDIT/ DEL : REPLY ]
  3. 굿

    알기 쉬운 설명덕분에 오류 없이 잘 되었습니다! 노하우를 공유해주셔서 감사합니다.

    2015.02.01 18:17 [ ADDR : EDIT/ DEL : REPLY ]
  4. 도와주세요ㅜ

    그렇게 설정을 해서 캐릭터set이 utf8로 설정되었는데도
    php myadmin에서 한글이 깨져서 나와요ㅜ
    php웹상에서는 제대로 한글이 표시가 되는데 DB로 insert하면 DB안에서는 한글이 깨져나와요ㅜㅜ
    아 머리아파서 너무 두서 없이 썻나...?
    원격이나 그런걸로 도와주실분 없나요ㅠㅠ

    2015.02.14 22:35 [ ADDR : EDIT/ DEL : REPLY ]
  5. 좋은 글 감사합니다
    저도 mysql에 ?? 값이 들어가서 찾아보던중에 들어왔습니다~
    저 그런데 위에서부터 따라하던 도중에.. my.ini파일이 총 두개여야 된다고 하셨는데..
    my.ini 파일을 두개 ( MYSQL5/ 에 한개 MYSQL%/data/ 기존경로에 한개.. ) 가 존재할 경우 아파치에서 mysql5가 실행되지 않습니다ㅜㅜ 왜그럴까요 ?

    2015.03.19 13:28 신고 [ ADDR : EDIT/ DEL : REPLY ]
  6. 길치

    감사합니다... 덕분에 광명을 찾았읍니다...
    그런데 PMA랑 웹상에서는 제대로 한글 출력이 되는데 cmd창에서는 한글이 다 깨져나오는 건 어떻게 해결해야 할까요...?

    2015.05.01 15:05 [ ADDR : EDIT/ DEL : REPLY ]
  7. 학생

    사랑합니다
    다른 분들은 그냥 이렇게 바꿔라만 해서 이해가 안갔는데 이렇게 친절한 설명들 덕분에 ㅠㅠ

    2015.06.08 05:12 [ ADDR : EDIT/ DEL : REPLY ]
  8. 감사합니다. ㅠㅠ;;
    너무 감사합니다. 실례인줄 알지만 소중한 포스팅 이라. 잊지 않으려 담아갔습니다.;
    출처는 그 어떤 제목보다 크게 기재해 놓았습니다.
    문제가 될시 즉시 삭제하겠습니다.

    하지만 무엇보다... 너무 감사합니다.

    2015.10.27 14:20 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 하단에 크리에이티브 커먼즈 라이선스에 의해서 출처만 공지하시면 언제든지 게제가 가능합니다. 내용중에 더 나은 방법이나 더 효율적인 방법이 있으시면 의견이나 공유 부탁드립니다~!

      2015.11.01 16:50 신고 [ ADDR : EDIT/ DEL ]
  9. ㅎㅎㅎㅎㅎ

    너무고마워요 ㅠㅠ

    2016.03.22 10:34 [ ADDR : EDIT/ DEL : REPLY ]
  10. 아씨 첨부터 저렇게 만들지 왜 저렇게 해놨을까요 정말 짜증나네여

    2016.03.23 19:17 신고 [ ADDR : EDIT/ DEL : REPLY ]
  11. shin

    위그림과 동일한 방법으로 하고 확인까지해서 아파치재실행해도 한글이 깨집니다
    다른이유가 있을까요??

    2017.11.25 09:07 [ ADDR : EDIT/ DEL : REPLY ]
  12. jun

    감사합니다.
    이것때문에 3~4시간 삽질했어요 ㅠㅠ

    2018.08.13 22:41 [ ADDR : EDIT/ DEL : REPLY ]