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 SET
charset_name
SET CHARACTER SET
은SET NAMES
와 비슷하지만,character_set_connection
과collation_connection
을character_set_database
과collation_database
로 설정합니다.SET CHARACTER SET
문은 다음 3 개의 문과 동일합니다.charset_name
SET 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 "오류 메시지의 문자 세트" 를 참조하십시오.