10.1.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시스템 변수 값은 서버가 클라이언트에 쿼리 결과를 회신 할 때 사용하는 문자 집합을 나타냅니다. 여기에는 컬럼 값 등의 결과 데이터와 컬럼 이름 또는 오류 메시지 등의 결과 메타 데이터가 포함됩니다.
클라이언트는 이러한 변수의 설정을 조정하거나 기본에 따를 수 있습니다 (이 경우이 섹션의 나머지를 건너 뛸 수 있습니다). 기본값을 사용하지 않는 경우, 서버에 연결마다 문자 설정을 변경해야합니다.
2 개의 문은 연결 관련 문자 집합 변수에 그룹으로 영향을 미칩니다.
SET NAMES 'charset_name' [COLLATE 'collation_name']SET NAMES는 클라이언트에서 서버에 SQL 문을 보내는 데 사용되는 문자 집합을 나타냅니다. 따라서SET NAMES 'cp1251'은 "이 클라이언트에서 지금부터 수신되는 메시지가 문자 세트cp1251전송되는 "것을 서버에 알립니다. 또한 클라이언트에 결과를 회신 할 때 서버가 사용하는 문자 집합을 지정합니다. (예를 들어,SELECT문을 사용하는 경우, 컬럼 값에 사용되는 문자 집합을 지정합니다.)SET NAMES '문은 다음 3 개의 문과 동일합니다.charset_name'SET character_set_client =
charset_name; SET character_set_results =charset_name; SET character_set_connection =charset_name;character_set_connection을charset_name으로 설정하면collation_connection도 암묵적으로charset_name의 기본 데이터 정렬로 설정됩니다. 이 데이터 정렬을 명시 적으로 설정할 필요가 없습니다. 특정 데이터 정렬을 지정하려면 옵션의COLLATE절을 사용합니다.SET NAMES 'charset_name'COLLATE'collation_name'SET CHARACTER SETcharset_nameSET CHARACTER SET은SET NAMES와 비슷하지만,character_set_connection과collation_connection을character_set_database과collation_database로 설정합니다.SET CHARACTER SET문은 다음 3 개의 문과 동일합니다.charset_nameSET character_set_client =
charset_name; SET character_set_results =charset_name; SET collation_connection = @@ collation_database;collation_connection을 설정하면character_set_connection도 연결된 문자 세트에 암묵적으로 설정됩니다 (SET character_set_connection = @@character_set_database의 실행과 동일합니다).character_set_connection을 명시 적으로 설정할 필요가 없습니다.
ucs2 , utf16 , utf16le 및 utf32 를 클라이언트 문자 집합으로 사용할 수 없습니다. 즉, 이들은 SET NAMES 또는 SET CHARACTER SET 에는 작동하지 않습니다.
MySQL 클라이언트 프로그램 mysql , mysqladmin , mysqlcheck , mysqlimport 및 mysqlshow 는 다음과 같이 사용하는 기본 문자 집합을 식별합니다.
다른 정보가 부족한 경우 프로그램은 컴파일시 기본 문자 집합 (일반적으로
latin1)를 사용합니다.프로그램은 운영 체제 설정 (예를 들어, Unix 시스템에서는
LANG및LC_ALL로컬 환경 변수의 값 Windows 시스템에서는 코드 페이지 설정)에 따라 사용할 문자 집합을 자동으로 감지합니다. 로케일이 OS에서 사용할 수있는 시스템의 경우 클라이언트는 컴파일시 기본값을 사용하는 것이 아니라,이 로케일을 사용하여 기본 문자 집합을 설정합니다. 예를 들어,LANG을ru_RU.KOI8-R로 설정하면koi8r문자 세트가 사용됩니다. 따라서 사용자는 MySQL 클라이언트가 사용할 수 있도록 자신의 환경에서 로케일을 구성 할 수 있습니다.OS 문자 집합은 정확하게 일치하는 것이 없으면 가장 가까운 MySQL 문자 집합에 매핑됩니다. 일치하는 문자 집합을 지원하지 않는 경우, 클라이언트는 컴파일이 기본값을 사용합니다. 예를 들어,
ucs2연결 문자 집합을 지원하지 않습니다.C 응용 프로그램은 서버에 연결하기 전에 다음과 같이
mysql_options()를 호출하여 OS 설정에 따라 문자 세트 자동 감지를 사용할 수 있습니다.mysql_options (mysql, MYSQL_SET_CHARSET_NAME, MYSQL_AUTODETECT_CHARSET_NAME);
프로그램은
--default-character-set옵션을 지원하고 있으며, 사용자는이 옵션을 사용하면 문자 세트를 명시 적으로 지정할 수 클라이언트가 다른 어떤 기본값을 지정 있어도 그것을 무시할 수 합니다.
클라이언트는 서버에 연결할 때 사용하는 문자 집합 이름을 보냅니다. 서버는이 이름을 사용하여 character_set_client , character_set_results 및 character_set_connection 시스템 변수를 설정합니다. 사실, 서버는 문자 집합 이름을 사용하여 SET NAMES 작업을 수행합니다.
mysql 클라이언트의 경우 기본값과 다른 문자 집합을 사용하려면 시작할 때마다, SET NAMES 를 명시 적으로 실행할 수 있습니다. 더 쉽게 동일한 결과를 얻으려면 --default-character-set 옵션 설정을 mysql 명령 행 또는 옵션 파일에 추가합니다. 예를 들어, 다음의 옵션 파일 설정은 mysql을 호출 할 때마다 koi8r 에 설정된 3 개의 연결 관련 문자 집합 변수를 변경합니다.
[mysql] default-character-set = koi8r
자동 재 연결을 사용하여 mysql 클라이언트를 사용하는 경우 (권장하지 않음), SET NAMES 보다는 charset 명령을 사용하는 것이 좋습니다. 예 :
mysql> charset utf8
Charset changed
charset 명령은 SET NAMES 명령문을 발행하고 연결 해제 후 다시 연결할 때 mysql이 사용하는 기본 문자 집합을 변경합니다.
예 : column1 이 CHAR(5) CHARACTER SET latin2 로 정의되어 있다고합니다. SET NAMES 또는 SET CHARACTER SET 를 지정하지 않는 경우, SELECT column1 FROM t 에 대해 서버는 연결시 클라이언트가 지정된 문자 세트를 사용하여 column1 의 모든 값을 돌려 보냅니다. 반대로, SET NAMES 'latin1' 또는 SET CHARACTER SET latin1 을 SELECT 문을 실행하기 전에 지정된 경우 서버는 결과를 회신하기 직전에 latin2 값을 latin1 로 변환합니다. 두 문자 집합에없는 문자가있는 경우 변환 손실이 커질 가능성이 있습니다.
서버에 결과 세트 또는 오류 메시지의 변환을 실행하지 않으면 character_set_results 를 NULL 또는 binary 로 설정하십시오.
SET character_set_results = NULL;
연결에 적용 할 문자 집합 및 데이터 정렬 시스템 변수의 값을 확인하려면 다음 문을 사용하십시오.
SHOW VARIABLES LIKE 'character_set %'; SHOW VARIABLES LIKE 'collation %';
MySQL 응용 프로그램을 실행하는 환경도 고려해야합니다. 섹션 10.1.5 "응용 프로그램의 문자 집합 및 정렬 순서 구성" 을 참조하십시오.
문자 세트 및 오류 메시지의 자세한 내용은 섹션 10.1.6 "오류 메시지의 문자 세트" 를 참조하십시오.