Loading...
MySQL 9.5 Reference Manual 9.5의 12.4 Connection Character Sets and Collations의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
“connection”은 클라이언트 프로그램이 서버에 접속하여, 그 안에서 서버와 상호작용하는 세션을 시작할 때 생성되는 것입니다. 클라이언트는 이 세션 커넥션을 통해 쿼리와 같은 SQL 문을 전송합니다. 서버는 결과 집합이나 에러 메시지와 같은 응답을 커넥션을 통해 클라이언트로 다시 전송합니다.
여러 문자 집합 및 콜레이션 시스템 변수는 클라이언트가 서버와 상호작용하는 방식과 관련이 있습니다. 이들 중 일부는 앞에서 이미 언급되었습니다:
character_set_server 및 collation_server 시스템 변수는 서버 문자 집합과 콜레이션을 나타냅니다. Section 12.3.2, “Server Character Set and Collation”을 참조하십시오.
character_set_database 및 collation_database 시스템 변수는 기본 데이터베이스의 문자 집합과 콜레이션을 나타냅니다. Section 12.3.3, “Database Character Set and Collation”을 참조하십시오.
추가적인 문자 집합 및 콜레이션 시스템 변수는 클라이언트와 서버 사이의 커넥션에서 발생하는 트래픽 처리에 관여합니다. 각 클라이언트는 세션별 커넥션 관련 문자 집합 및 콜레이션 시스템 변수를 가집니다. 이러한 세션 시스템 변수 값은 접속 시점에 초기화되지만, 세션 내에서 변경할 수 있습니다.
클라이언트 커넥션에 대한 문자 집합 및 콜레이션 처리와 관련된 여러 질문은 시스템 변수의 관점에서 답할 수 있습니다:
문이 클라이언트를 떠날 때, 그것은 어떤 문자 집합에 속합니까?
서버는 character_set_client 시스템 변수를 클라이언트가 보내는 문의 문자 집합으로 간주합니다.
참고
일부 문자 집합은 클라이언트 문자 집합으로 사용할 수 없습니다. Impermissible Client Character Sets을 참조하십시오.
서버는 문을 수신한 후 어떤 문자 집합으로 변환해야 합니까?
이를 결정하기 위해 서버는 character_set_connection 및 collation_connection 시스템 변수를 사용합니다:
서버는 클라이언트가 보낸 문을 character_set_client에서 character_set_connection으로 변환합니다. 예외: _utf8mb4 또는 _latin2와 같은 인트로듀서가 있는 문자열 리터럴의 경우 인트로듀서가 문자 집합을 결정합니다. Section 12.3.8, “Character Set Introducers”를 참조하십시오.
collation_connection은 리터럴 문자열 비교에 중요합니다. 컬럼 값과 문자열을 비교하는 경우에는, 컬럼마다 자체 콜레이션을 가지며 이는 더 높은 콜레이션 우선순위를 갖기 때문에 collation_connection은 중요하지 않습니다 (Section 12.8.4, “Collation Coercibility in Expressions” 참조).
서버는 쿼리 결과를 클라이언트로 다시 전송하기 전에 어떤 문자 집합으로 변환해야 합니까?
character_set_results 시스템 변수는 서버가 클라이언트에 쿼리 결과를 반환할 때 사용할 문자 집합을 나타냅니다. 여기에는 컬럼 값과 같은 결과 데이터, 컬럼 이름과 같은 결과 메타데이터, 에러 메시지 등이 포함됩니다.
서버가 결과 집합 또는 에러 메시지에 대해 어떤 변환도 수행하지 않도록 하려면, character_set_results를 NULL 또는 binary로 설정하십시오:
1SET character_set_results = NULL; 2SET character_set_results = binary;
문자 집합과 에러 메시지에 대한 자세한 내용은 Section 12.6, “Error Message Character Set”을 참조하십시오.
현재 세션에 적용되는 문자 집합 및 콜레이션 시스템 변수의 값을 확인하려면 다음 문을 사용하십시오:
1SELECT * FROM performance_schema.session_variables 2WHERE VARIABLE_NAME IN ( 3 'character_set_client', 'character_set_connection', 4 'character_set_results', 'collation_connection' 5) ORDER BY VARIABLE_NAME;
다음과 같은 더 단순한 문들도 커넥션 변수를 표시하지만, 다른 관련 변수도 함께 포함합니다. 이들은 모든 문자 집합 및 콜레이션 시스템 변수를 확인하는 데 유용할 수 있습니다:
1SHOW SESSION VARIABLES LIKE 'character\_set\_%'; 2SHOW SESSION VARIABLES LIKE 'collation\_%';
클라이언트는 이러한 변수에 대한 설정을 세밀하게 조정할 수 있고, 또는 기본값에 의존할 수도 있습니다 (이 경우 이 절의 나머지 부분은 건너뛸 수 있습니다). 기본값을 사용하지 않는다면, 각각의 커넥션마다 서버에 대한 문자 설정을 변경해야 합니다.
character_set_client 시스템 변수는 특정 문자 집합으로 설정할 수 없습니다:
1ucs2 2utf16 3utf16le 4utf32
이러한 문자 집합을 클라이언트 문자 집합으로 사용하려고 시도하면 에러가 발생합니다:
1mysql> SET character_set_client = 'ucs2'; 2ERROR 1231 (42000): Variable 'character_set_client' 3can't be set to the value of 'ucs2'
동일한 에러는 다음과 같은 컨텍스트에서 이들 문자 집합 중 하나를 사용하는 경우에도 발생하며, 이 모든 경우 결국 character_set_client를 해당 문자 집합으로 설정하려는 시도가 됩니다:
MySQL 클라이언트 프로그램인 mysql 및 mysqladmin에서 사용하는 --default-character-set=charset_name 명령 옵션.
클라이언트가 서버에 접속할 때, 서버와의 통신에 사용하려는 문자 집합을 지정합니다. (실제로는, 클라이언트는 해당 문자 집합에 대한 기본 콜레이션을 지정하고, 서버는 이를 통해 문자 집합을 결정할 수 있습니다.) 서버는 이 정보를 사용하여 character_set_client, character_set_results, character_set_connection 시스템 변수를 그 문자 집합으로 설정하고, collation_connection을 해당 문자 집합의 기본 콜레이션으로 설정합니다. 사실상, 서버는 SET NAMES 연산과 동등한 작업을 수행합니다.
서버가 요청된 문자 집합이나 콜레이션을 지원하지 않으면, 커넥션을 설정하기 위해 서버의 문자 집합과 콜레이션으로 되돌아갑니다. 이러한 폴백 동작에 대한 자세한 내용은 Connection Character Set Error Handling을 참조하십시오.
mysql, mysqladmin, mysqlcheck, mysqlimport, mysqlshow 클라이언트 프로그램은 기본으로 사용할 문자 집합을 다음과 같이 결정합니다:
다른 정보가 없을 때, 각 클라이언트는 보통 utf8mb4인 컴파일된 기본 문자 집합을 사용합니다.
각 클라이언트는 운영 체제 설정에 따라 사용할 문자 집합을 자동 감지할 수 있습니다. 예를 들어 Unix 시스템에서는 LANG 또는 LC_ALL 로캘 환경 변수의 값, Windows 시스템에서는 코드 페이지 설정을 기반으로 합니다. OS에서 로캘을 사용할 수 있는 시스템에서는, 클라이언트는 컴파일된 기본값 대신 로캘을 사용하여 기본 문자 집합을 설정합니다. 예를 들어 LANG를 ru_RU.KOI8-R로 설정하면 koi8r 문자 집합이 사용됩니다. 따라서 사용자는 자신의 환경에서 로캘을 설정하여 MySQL 클라이언트에서 사용되도록 구성할 수 있습니다.
OS 문자 집합이 정확히 일치하는 것이 없으면, 가장 가까운 MySQL 문자 집합으로 매핑됩니다. 클라이언트가 해당 매칭 문자 집합을 지원하지 않으면, 컴파일된 기본값을 사용합니다. 예를 들어, utf8과 utf-8은 utf8mb4로 매핑되고, ucs2는 커넥션 문자 집합으로 지원되지 않으므로 컴파일된 기본값으로 매핑됩니다.
C 애플리케이션은 서버에 접속하기 전에 다음과 같이 mysql_options()를 호출하여 OS 설정 기반 문자 집합 자동 감지를 사용할 수 있습니다:
1mysql_options(mysql, 2 MYSQL_SET_CHARSET_NAME, 3 MYSQL_AUTODETECT_CHARSET_NAME);
--default-character-set 옵션을 지원하며, 이를 통해 사용자는 클라이언트가 다른 방식으로 결정한 기본값을 무시하고 명시적으로 문자 집합을 지정할 수 있습니다.참고
일부 문자 집합은 클라이언트 문자 집합으로 사용할 수 없습니다. 이들을 --default-character-set과 함께 사용하려고 하면 에러가 발생합니다. Impermissible Client Character Sets을 참조하십시오.
mysql 클라이언트에서 기본값과 다른 문자 집합을 사용하려면, 서버에 접속할 때마다 SET NAMES 문을 명시적으로 실행할 수 있습니다 (Client Program Connection Character Set Configuration 참조). 동일한 결과를 보다 쉽게 얻으려면, 옵션 파일에 문자 집합을 지정하십시오. 예를 들어 다음 옵션 파일 설정은 mysql을 실행할 때마다 세 개의 커넥션 관련 문자 집합 시스템 변수를 koi8r로 변경합니다:
1[mysql] 2default-character-set=koi8r
자동 재접속이 활성화된 상태(권장되지 않음)로 mysql 클라이언트를 사용하는 경우, SET NAMES보다 charset 명령을 사용하는 것이 더 바람직합니다. 예:
1mysql> charset koi8r 2Charset changed
charset 명령은 SET NAMES 문을 실행하며, 또한 커넥션이 끊어진 후 재접속할 때 mysql이 사용할 기본 문자 집합도 변경합니다.
클라이언트 프로그램을 구성할 때는, 그것들이 실행되는 환경도 고려해야 합니다. Section 12.5, “Configuring Application Character Set and Collation”을 참조하십시오.
커넥션이 설정된 후, 클라이언트는 현재 세션에 대해 문자 집합 및 콜레이션 시스템 변수를 변경할 수 있습니다. 이러한 변수는 SET 문을 사용하여 개별적으로 변경할 수 있지만, 커넥션 관련 문자 집합 시스템 변수 전체에 영향을 주는 두 개의 더 편리한 문이 있습니다:
SET NAMES 'charset_name' [COLLATE 'collation_name']
SET NAMES는 클라이언트가 서버로 SQL 문을 보낼 때 사용할 문자 집합을 나타냅니다. 따라서 SET NAMES 'cp1251'은 서버에 “이 클라이언트로부터의 향후 수신 메시지는 cp1251 문자 집합으로 온다.”라고 알려 줍니다. 또한 서버가 클라이언트로 결과를 전송할 때 사용해야 할 문자 집합도 지정합니다. (예를 들어 결과 집합을 생성하는 SELECT 문을 사용할 때 컬럼 값에 사용할 문자 집합을 지정합니다.)
SET NAMES 'charset_name' 문은 다음 세 개의 문과 동일합니다:
1SET character_set_client = charset_name; 2SET character_set_results = charset_name; 3SET character_set_connection = charset_name;
character_set_connection을 charset_name으로 설정하면, collation_connection이 charset_name의 기본 콜레이션으로 암묵적으로 설정됩니다. 이 콜레이션을 명시적으로 설정할 필요는 없습니다. collation_connection에 사용할 특정 콜레이션을 지정하려면 COLLATE 절을 추가하십시오:
1SET 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 charset_name 문은 다음 세 개의 문과 동일합니다:
1SET character_set_client = charset_name; 2SET character_set_results = charset_name; 3SET collation_connection = @@collation_database;
collation_connection을 설정하면, 해당 콜레이션과 관련된 문자 집합으로 character_set_connection이 암묵적으로 설정됩니다 (SET character_set_connection = @@character_set_database 실행과 동일). character_set_connection을 명시적으로 설정할 필요는 없습니다.
참고
일부 문자 집합은 클라이언트 문자 집합으로 사용할 수 없습니다. 이들을 SET NAMES 또는 SET CHARACTER SET과 함께 사용하려고 하면 에러가 발생합니다. Impermissible Client Character Sets을 참조하십시오.
예: column1이 CHAR(5) CHARACTER SET latin2로 정의되어 있다고 가정합니다. SET NAMES 또는 SET CHARACTER SET을 사용하지 않은 상태에서 SELECT column1 FROM t를 실행하면, 서버는 클라이언트가 접속할 때 지정한 문자 집합을 사용하여 column1의 모든 값을 전송합니다. 반면, SELECT 문을 실행하기 전에 SET NAMES 'latin1' 또는 SET CHARACTER SET 'latin1'을 실행하면, 서버는 결과를 전송하기 직전에 latin2 값을 latin1으로 변환합니다. 두 문자 집합 모두에 존재하지 않는 문자의 경우 변환이 손실될 수 있습니다.
부적절한 커넥션 문자 집합이나 콜레이션을 사용하려고 하면 에러가 발생하거나, 서버가 해당 커넥션에 대해 기본 문자 집합과 콜레이션으로 되돌아갈 수 있습니다. 이 절에서는 커넥션 문자 집합을 구성할 때 발생할 수 있는 문제를 설명합니다. 이러한 문제는 커넥션을 설정하는 동안 또는 이미 설정된 커넥션 내에서 문자 집합을 변경할 때 발생할 수 있습니다.
일부 문자 집합은 클라이언트 문자 집합으로 사용할 수 없습니다. Impermissible Client Character Sets을 참조하십시오. 클라이언트 문자 집합으로 허용되지 않는, 유효하지만 허용되지 않는 문자 집합을 지정하면 서버는 에러를 반환합니다:
1$> mysql --default-character-set=ucs2 2ERROR 1231 (42000): Variable 'character_set_client' can't be set to 3the value of 'ucs2'
클라이언트가 인식하지 못하는 문자 집합을 지정하면 클라이언트가 에러를 발생시킵니다:
1$> mysql --default-character-set=bogus 2mysql: Character set 'bogus' is not a compiled character set and is 3not specified in the '/usr/local/mysql/share/charsets/Index.xml' file 4ERROR 2019 (HY000): Can't initialize character set bogus 5(path: /usr/local/mysql/share/charsets/)
클라이언트가 인식하지만 서버가 인식하지 못하는 문자 집합을 지정하면, 서버는 기본 문자 집합과 콜레이션으로 되돌아갑니다. 예를 들어 서버가 기본으로 latin1과 latin1_swedish_ci를 사용하도록 구성되어 있고, gb18030을 유효한 문자 집합으로 인식하지 못한다고 가정합니다. 이때 --default-character-set=gb18030을 지정한 클라이언트는 서버에 접속할 수 있지만, 결과적으로 사용되는 문자 집합은 클라이언트가 원하는 것이 아닙니다:
1mysql> SHOW SESSION VARIABLES LIKE 'character\_set\_%'; 2+--------------------------+--------+ 3| Variable_name | Value | 4+--------------------------+--------+ 5| character_set_client | latin1 | 6| character_set_connection | latin1 | 7... 8| character_set_results | latin1 | 9... 10+--------------------------+--------+ 11mysql> SHOW SESSION VARIABLES LIKE 'collation_connection'; 12+----------------------+-------------------+ 13| Variable_name | Value | 14+----------------------+-------------------+ 15| collation_connection | latin1_swedish_ci | 16+----------------------+-------------------+
커넥션 시스템 변수가 latin1 및 latin1_swedish_ci의 문자 집합과 콜레이션을 반영하도록 설정된 것을 볼 수 있습니다. 이는 서버가 클라이언트의 문자 집합 요청을 만족시킬 수 없기 때문에 기본값으로 되돌아가기 때문입니다.
이 경우, 서버가 해당 문자 집합을 지원하지 않기 때문에 클라이언트는 원하는 문자 집합을 사용할 수 없습니다. 클라이언트는 다른 문자 집합을 사용할 의향이 있거나, 원하는 문자 집합을 지원하는 다른 서버에 접속해야 합니다.
동일한 문제는 클라이언트가 서버가 인식하는 문자 집합을 지정했지만, 클라이언트 측에서 해당 문자 집합의 기본 콜레이션이 서버 측에서 알려져 있지 않은 경우에도 발생합니다.
설정이 완료된 커넥션 내에서, 클라이언트는 SET NAMES 또는 SET CHARACTER SET을 사용하여 커넥션 문자 집합 및 콜레이션 변경을 요청할 수 있습니다.
일부 문자 집합은 클라이언트 문자 집합으로 사용할 수 없습니다. Impermissible Client Character Sets을 참조하십시오. 클라이언트 문자 집합으로 허용되지 않는, 유효하지만 허용되지 않는 문자 집합을 지정하면 서버는 에러를 반환합니다:
1mysql> SET NAMES 'ucs2'; 2ERROR 1231 (42000): Variable 'character_set_client' can't be set to 3the value of 'ucs2'
서버가 문자 집합(또는 콜레이션)을 인식하지 못하면, 에러를 발생시킵니다:
1mysql> SET NAMES 'bogus'; 2ERROR 1115 (42000): Unknown character set: 'bogus' 3 4mysql> SET NAMES 'utf8mb4' COLLATE 'bogus'; 5ERROR 1273 (HY000): Unknown collation: 'bogus'
참고
서버가 요청된 문자 집합을 실제로 적용했는지 확인하고자 하는 클라이언트는 접속 후 다음 문을 실행하여 결과가 기대한 문자 집합인지 확인할 수 있습니다:
1SELECT @@character_set_client;
12.3.10 Compatibility with Other DBMSs
12.5 Configuring Application Character Set and Collation