10.1.12 메타 데이터에 UTF-8
메타 데이터는 "데이터에 대한 데이터"입니다. 데이터베이스에 적용하는 모든 것이 메타 데이터이며, 데이터베이스의 내용이 없습니다. 따라서 열 이름, 데이터베이스 이름, 사용자 이름, 버전 이름 및 SHOW
문자열 결과 대부분이 메타 데이터입니다. INFORMATION_SCHEMA
의 테이블 정의에서 데이터베이스 개체에 대한 정보를 포함하고 있기 때문에 이것은이 테이블의 내용에도 적용됩니다.
메타 데이터의 표현은 다음의 요구 사항을 충족해야합니다.
모든 메타 데이터에서 문자 세트가 일치해야합니다. 그렇지 않으면,
INFORMATION_SCHEMA
의 테이블에 대한SHOW
문도SELECT
문도 제대로 작동하지 않습니다. 이러한 연산 결과의 동일한 컬럼의 각 행에서 문자 집합이 다르기 때문입니다.메타 데이터는 모든 언어의 모든 문자가 포함되어 있어야합니다. 그렇지 않은 경우, 사용자는 각각의 언어를 사용하여 컬럼과 테이블에 이름을 붙일 수 없습니다.
모두의 요구 사항을 충족하기 위해 MySQL에서는 Unicode 캐릭터 세트, 즉 UTF-8로 메타 데이터를 저장합니다. 악센트 부호가있는 문자 나 라틴어가 아닌 문자를 사용하지 않으면 혼란이 발생하지 않습니다. 그러나 사용하면 메타 데이터의 문자 집합이 UTF-8임을 인식해야합니다.
이 메타 데이터 요구 사항은 USER()
, CURRENT_USER()
, SESSION_USER()
, SYSTEM_USER()
, DATABASE()
및 VERSION()
함수의 반환 값에서 UTF-8 문자 세트가 기본적으로 사용되는 것을 의미합니다.
서버는 character_set_system
시스템 변수를 메타 데이터 문자 세트의 이름으로 설정합니다.
mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| character_set_system | utf8 |
+----------------------+-------+
Unicode를 사용하여 메타 데이터를 저장해도 서버가 컬럼 헤더와 DESCRIBE
함수의 결과를 기본으로 character_set_system
문자 세트로 반환이되지 않습니다. SELECT column1 FROM t
을 사용하면 character_set_results
시스템 변수의 값 (기본값은 latin1
)로 특정되는 문자 집합 이름 column1
자체가 서버에서 클라이언트에 반환됩니다. 다른 문자 집합에서 메타 데이터의 결과를 서버로 반환하는 경우, SET NAMES
명령문을 사용하여 서버에 문자 집합 변환을 강제로 실행시켜주세요. SET NAMES
는 character_set_results
와 관련된 다른 시스템 변수를 설정합니다. ( 섹션 10.1.4 "연결 문자 집합 및 정렬 순서" 를 참조하십시오.) 또한 서버에서 결과를받은 후에 클라이언트 프로그램이 변환을 수행 할 수 있습니다. 클라이언트가 변환을 실행하면 더 효율적이지만,이 옵션은 모든 클라이언트가 항상 사용할 수있는 것은 아닙니다.
character_set_results
이 NULL
로 설정되어있는 경우, 변환은 실행되지 않고 서버는 원래의 문자 세트 ( character_set_system
의해 지정된 세트)를 사용하여 메타 데이터를 반환합니다.
서버에서 클라이언트에 반환되는 오류 메시지는 메타 데이터와 마찬가지로 자동으로 클라이언트 문자 집합으로 변환됩니다.
예를 들어, USER()
함수를 비교 또는 지정을 위해 하나의 문에서 사용하는 경우 문제가되지 않습니다. MySQL이 자동으로 변환을 실행합니다.
SELECT * FROM t1 WHERE USER () = latin1_column;
이것이 기능하는 것은 latin1_column
의 내용이 UTF-8로 자동 변환되고 나서 비교를 수행하기 때문입니다.
INSERT INTO t1 (latin1_column) SELECT USER ();
이 기능은 USER()
의 내용이 latin1
으로 자동 변환 된 후 할당이 이루어지기 때문입니다.
자동 변환 기능은 SQL 표준에는 포함되어 있지 않습니다. 그러나 어떤 문자 세트도 (지원되는 문자에 대해) Unicode의 "일부"임을 SQL 표준 문서에 기재되어 있습니다. "슈퍼 세트에 적용되는 것은 일부에도 적용된다"라고 잘 알려진 원칙이 있기 때문에 Unicode 데이터 정렬은 Unicode 이외의 문자열과 비교도 적용 할 수 있다고 생각합니다. 문자열의 강제력 대한 자세한 내용은 섹션 10.1.7.5 "식의 데이터 정렬" 을 참조하십시오.