MySQL 4.1 이상부터 인코딩 방법이 크게 달라진것 같다. 내가 사용하는 방법은 MySQL5.1.x 에서 실험한 방법이다. 이 방법은 아직 실험이 더 필요한 것 같다. 내 실력이 안 좋아, 정확한 방법을 찾을 수 없다. 여기 있는 내용은 http://dev.mysql.com/doc/refman/5.1/en/index.html 을 참조했다. 이중 10장 Chapter 10. Character Set Support 이 필요한다.

MySQL5 에서는 인코딩할 수 있는 다양한 방법을 제공한다. 서버수준, Database 수준, 테이블 수준, 컬럼 수준에서 인코딩을 지정할 수 있다. 서버수준은 my.ini 파일로 수정하거나 서버를 시작할 때 옵션으로 설정하는 것 같고, 나머지 수준은 인코딩방법을 그 디비, 테이블, 컬럼을 정의할 때 설정한다.
서버를 시작할 때, mysqld --character-set-server=latin1 이런 식으로 캐릭터 세팅을 할 수 있다. 우리에게는 latin1 대신 euckr(또는 cp949)과 utf8 사이에서 왔다 갔다 할 일이 많을 것이다. 나머지 에서는 CHARACTER SET charset_name 과 COLLATE collation_name 으로 적정히 사용한다.
데이터베이스 수준에서는
--------------------------------------------
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
---------------------------------------------
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
---------------------------------------------
을 적정히 사용한다. 그냥 Database 를 만들거 변경하게 된다면 default 값이 적용되고 이 값은 서버세팅의 값을 갖게 된다.
나머지 수준에서도 이런 식이다.

테이블 수준의 세팅
-------------------------------------------------
CREATE TABLE tbl_name (column_list)
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]]
-------------------------------------------------
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
-------------------------------------------------

컴럼수준
-------------------------------------------------------
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name] [COLLATE collation_name]
-------------------------------------------------------

예제로
--------------------------------------
CREATE TABLE Table1
(
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);
-----------------------------------
이런 식으로 사용한다.


이제 우리가 궁금한 것은 CHARACTER 과 COLLATE 의 쓰임새와 사용가능한 것이다. CHARACTER 은 인코딩 방법을 지정하는 것이고 collate 는 정렬 방식이나 검색 방식을 말한다.
CHARACTER 은 우리에게 필요할 만 한 것이 utf8 과 euckr 이 있다. CHARACTER 을 utf8 로 지정할 때 사용가능한 COLLATE 은 엄청많으나 우리에게 유용할 것 같은것은 utf8_general_ci 와 utf8_bin 이다. euckr 로 지정할 경우는 euckr_korean_ci 와 euckr_bin 이 있다. bin 이 있고 없고의 차이는 나중에 검색할 때, 숫자그대로 검색할 것이냐(A와 a 는 코드로 비교하면 다른 것이다. ) 문자로 검색(a 와 A 는 문자로 같다. ) 의 차이나고 한다. 당연히 bin 이 숫자 그대로 검색하는 것으로 보인다. (검색 할 때는 이 옵션을 줄 수 있으니 이것보다 정렬에 의한 문제가 더 큰 것 같다. )
내가 이런 코드 들이 있다는 것을 알고 있는 이유는 MySQL GUI Tools 이용하기 때문이다. 이게 설정 방법을 편하게 해준다.

다시 살펴보면 테이블 수준으로 지정하는 것이 좋아 보인다. 이제는 utf8 이 대세라, 서버에서 utf8 로 설정해야 할 것 같다. MySQL Server Instance Config Wizard 가 서버 수준의 세팅을 돕는 것으로 판단된다. (내 능력이 부족해 확신 할 수 없다.)



PHP 와 MySQL 이 쿼리를 주고 받기 위해서는 mysql_query("set names CHARACTER "); 을 연결한 다음에 보내 주어야 한다.


PHP에서 MySQL4.1 이상 버전으로 한글이 들어간 쿼리문을 날리기 위해서는 2가지 방법이 있다.

테이블에서 euckr 으로 설정했을 때 다음과 같이 하면 된다.
------------------------------------------
mysql_query("set names euckr ");
$sql = 'insert into bbs_euckr value(2, "이름", "제목", "내용")';
mysql_query($sql) or die (mysql_error());
------------------------------------------

핵심부분은 mysql_query("set names euckr "); 를 날려야 한다.
PHP에서 mysql 과 연결할 때, 기본 인코딩 방식이 있다. 이를 바꾸기 위해 이 쿼리가 들어간다.

테이블에서 utf-8 로 설정했을 때는 다음과 같이 쿼리를 보내면된다.
-------------------------------------------
mysql_query("set names utf8");
echo $sql = 'insert into bbs_utf8 value(2, "이름", "제목", "내용")';
echo $sql = iconv("cp949", "utf-8", $sql);
mysql_query($sql) or die (mysql_error());
---------------------------------------------
이 방법은 인코딩을 내가 입력한 글자 인코딩을 euc-kr 에서 utf-8 로 바꾸는 코드가 들어가 있다.
echo $sql = iconv("cp949", "utf-8", $sql); 이 부분이다.


맨 처음 mysql_query("set names utf8"); 는 어떻게 알아 먹는지 신기하지 않는가. 결국, utf-8 이나 아스키 방식이나 영어는 문제되지 않는 다는 것이다. 결과 적으로 한글을 사용하는 사람들이 고통이라는 것이다. 이런.. utf-16으로 넘어 가면 어떻게 될려나.

아직 이게 정확히 작동하는지 확신이 들지 않는다. MySQL 안에 있는 데이터가 euckr 로 들어 있는지 모르겠다. 특 이한 문자에 대해 정렬을 해 보면 알 수 있을 것 같은데.
(계속 수정 중.
언제 수정이 끝나려나. 컴퓨터의 세계는 정말 미묘하다. )