http://www.mysqlkorea.co.kr
한글매뉴얼 5.0 , 한글매뉴얼 5.1 , MySQL 5.1 HA , 사용자매뉴얼
한글매뉴얼 5.0  
한글매뉴얼 5.1  
MYSQL 5.1 HA  
사용자매뉴얼  
영문매뉴얼  
최신글
MySQL 5.7에서 프…
DB 행 증상이 주…
Maria에서 프로시…
MySQL DBA과정(4…
MySQL 5.7.19 설…
 
한글매뉴얼 5.1 > 매뉴얼존 > 한글매뉴얼 5.1
 

10.4. 문자 셋과 콜레션 연결하기

 

몇몇 문자 셋과 콜레션 시스템 변수는 서버와 클라이언트의 상호 작용과 관련을 갖는다. 이러한 것들 중의 몇 가지는 이전 세션에서 언급하였다:

  • 서버 문자 셋과 콜레션은 character_set_server collation_server 시스템 변수 값을 가지고 결정할 수 있다.
  • 디폴트 데이터 베이스 문자 셋과 콜레션은 character_set_database collation_database 시스템 변수 값을 가지고 결정할 수 있다.

추가적인 문자 셋 및 콜레션 시스템 변수는 클라이언트와 서버간의 통신을 처리할 때 포함된다. 모든 클라이언트는 연결과 관련한 문자 셋과 콜레션 시스템 변수를 가지고 있다.

 

연결이란 무엇인지를 생각해 보자: 연결이란 서버에 접속을 할 때 만드는 것을 의미한다. 클라이언트는 쿼리와 같은 SQL 명령문을 서버와의 연결 통로를 통해 전달한다. 서버는 결과 셋과 같은 것을 동일한 연결 통로를 통해 클라이언트에 전달한다. 이것은 클라이언트 연결을 처리하는 문자 셋과 콜레션에 대해서 몇 가지 궁금한 사항을 일으키게 되는데, 각각의 것들은 시스템 변수에 의해 답을 할 수가 있게 된다:

  • 명령문을 클라이언트에서 보낼 때 포함되는 문자 셋은 어떤 것인가?

서버는 클라이언트가 보낸 명령문에 있는 문자 셋을 사용하기 위해 character_set_client 시스템 변수를 가져 온다.

  • 서버가 명령문을 받은 후에 이것을 해석하기 위해서 사용하는 문자 셋은 어떤 것인가?

서버는 character_set_connection collation_connection 시스템 변수를 사용한다. 서버는 클라이언트가 전달한 명령문을 character_set_client에서 character_set_connection (_latin1 또는 _utf8과 같이 인트로듀서를 가지고 있는 스트링 리터럴은 예외)로 변환 시킨다. collation_connection은 리터럴 스트링 비교를 위해 매우 중요한 것이다. 컬럼 값을 사용해서 스트링을 비교하는 경우에는 collation_connection가 그리 중요하지가 않게 되는데, 그 이유는 컬럼이 자체 콜레션을 가지고 있기 때문이며, 이것이 보다 우선적인 순위를 갖는 콜레션이 되기 때문이다.

  • 결과 셋 또는 에러 메시지를 클라이언트에 돌려 보내기 전에 서버가 해석해야 하는 문자 셋은 어떤 것이 있는가?

character_set_results 시스템 변수는 서버가 쿼리 결과를 클라이언트에 돌려 보낼 때 포함 되어 있는 문자 셋을 가리킨다. 이것에는 컬럼 값, 그리고 컬럼 이름과 같은 결과 메타 데이터 등이 포함된다.

 

여러분은 이러한 변수들을 튜닝 설정할 수 있으며, 또는 디폴트 값을 사용할 수도 있다.

접속 문자 셋에 영향을 주는 명령문은 두 개가 있다:

 

SET NAMES 'charset_name'

SET CHARACTER SET charset_name

 

SET NAMES는 클라이언트가 서버에 SQL명령문을 보낼 때 사용하는 문자 셋을 가리킨다. 따라서, SET NAMES 'cp1251'이 클라이언트로부터 오게 될 메시지는 cp1251 문자 셋을 사용한다라는 의미를 서버에게 전달 한다. 또한, 이것은 서버가 클라이언트에 결과를 돌려 줄 때 사용하는 문자 셋을 나타내기도 한다. (예를 들면, 이것은 여러분이 SELECT 명령문을 사용할 경우 컬럼 값을 위해 사용할 문자 셋을 가리키는 것이다.)

 

SET NAMES 'x' 명령문은 아래의 세 명령문과 동일한 것이다:

 

SET character_set_client = x;

SET character_set_results = x;

SET character_set_connection = x;

 

Setting character_set_connectionx로 설정하면, x에 대한 디폴트 콜레션이 collation_connection으로 동시에 설정된다. 콜레션을 명확하게 설정할 필요는 없다. 문자 셋에 대해서 특정 콜레션을 지정하기 위해서는 COLLATE 구문을 사용한다:

 

SET NAMES 'charset_name' COLLATE 'collation_name'

 

SET CHARACTER SETSET NAMES과 유사하지만 character_set_connection collation_connectioncharacter_set_database collation_database로 설정한다. SET CHARACTER SET x 명령문은 아래의 세 명령문과 동일한 것이다:

 

SET character_set_client = x;

SET character_set_results = x;

SET collation_connection = @@collation_database;

 

collation_connection에 대한 설정은 character_set_connection을 콜레션과 관련된 문자 셋으로 동시에 설정해 준다 (SET character_set_connection = @@character_set_database를 실행하는 것과 동일함). character_set_connection를 명확하게 설정할 필요는 없다.

 

클라이언트가 연결이 되면, 클라이언트는 자신이 사용할 문자 셋 이름을 서버에 전달한다. 서버는 이 이름을 사용해서 character_set_client, character_set_results, character_set_connection 시스템 변수를 설정한다. 서버는 문자 셋 이름을 사용해서 SET NAMES 연산을 실행하게 된다.

 

mysql 클라이언트를 사용한다면, 디폴트 문자 셋과 다른 것을 사용하고자 할 때마다 서버에서 매번 SET NAMES를 실행할 필요가 없어진다. mysql 명령문 라인, 또는 옵션 파일에 --default-character-set 옵션을 설정을 추가 할 수도 있다. 예를 들면, 아래의 옵션 파일 설정은 mysql 명령문 호출할 때 마다 세 가지 문자 셋 설정 변수를 koi8r로 변경 시킨다:

 

[mysql]

default-character-set=koi8r

 

mysql 클라이언트를 자동-재 연결 모드 (권장 모드는 아님)으로 사용한다면, SET NAMES 보다는 charset 명령어를 사용하도록 한다. 예를 들면:

 

mysql> charset utf8

Charset changed

 

charset 명령어는 SET NAMES 명령문을 실행하며, 연결이 종료된 후에 mysql가 다시 연결될 때 디폴트 문자 셋 역시 변경한다.

 

예문: column1CHAR(5) CHARACTER SET latin2로 정의 되었다고 가정하자. 만일 여러분이 SET NAMES 또는 SET CHARACTER SET을 지정하지 않는다면, SELECT column1 FROM t에 대해서, 서버는 클라이언트가 서버에 연결할 때 지정한 문자 셋을 사용해서 column1에 대한 모든 값을 돌려 준다. 이에 반해서, 만일 여러분이 SELECT 명령문을 입력하기 전에 SET NAMES 'latin1' 또는 SET CHARACTER SET latin1을 입력하면, 서버는 결과를 돌려 보내기 바로 전에 latin2 값을 latin1로 변환 시킨다. 양쪽 문자 셋에 있지 않는 문자를 변환할 경우에는 다소 시간이 길게 걸리기도 한다.

 

서버가 결과 셋을 변환 시키지 못하도록 하고자 한다면, character_set_resultsNULL로 설정한다:

 

SET character_set_results = NULL;

 

Note: 현재까지는, UCS-2를 클라이언트의 문자 셋으로 사용할 수는 없으며, 이것은 SET NAMES 'ucs2'는 동작을 하지 않는다는 것을 의미한다.

 

서버에 연결할 때 사용한 문자 셋과 콜레션 시스템 변수 값을 보고자 한다면, 아래의 명령문을 사용하도록 한다:

 

SHOW VARIABLES LIKE 'character_set%';

SHOW VARIABLES LIKE 'collation%';

상위
10.4. 문자 셋과 콜레션 연결하…
MySQL Korea 사이트의 컨텐츠 소유권은 (주)상상이비즈에 있으므로 무단전재를 금합니다.
ⓒ 2010-2011 ssebiz All Rights Reserved.