Loading...
MySQL 9.5 Reference Manual 9.5의 12.2.2 UTF-8 for Metadata의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Metadata는 “데이터에 대한 데이터”입니다. 데이터베이스의 내용 이 아닌, 데이터베이스를 설명하는 모든 것이 metadata입니다. 따라서 column 이름, database 이름, user 이름, version 이름, 그리고 SHOW로부터 나오는 대부분의 string 결과는 metadata입니다. 이는 INFORMATION_SCHEMA 내의 table 내용에도 해당하는데, 그 table들은 정의상 데이터베이스 객체에 대한 정보를 포함하기 때문입니다.
Metadata 표현은 다음 요구 사항을 충족해야 합니다:
모든 metadata는 동일한 문자 집합이어야 합니다. 그렇지 않으면, SHOW 구문이나 INFORMATION_SCHEMA의 table에 대한 SELECT 구문이 제대로 동작하지 않을 수 있는데, 그 이유는 이러한 연산의 결과에서 동일한 column의 서로 다른 row들이 서로 다른 문자 집합으로 되어 있을 수 있기 때문입니다.
Metadata는 모든 언어의 모든 문자를 포함해야 합니다. 그렇지 않으면, 사용자가 자신의 언어를 사용하여 column과 table에 이름을 붙일 수 없게 됩니다.
두 가지 요구 사항을 모두 충족하기 위해, MySQL은 metadata를 유니코드 문자 집합, 즉 UTF-8에 저장합니다. 악센트 문자나 비-Latin 문자를 전혀 사용하지 않는다면 이것이 어떤 문제도 일으키지 않습니다. 그러나 이를 사용하는 경우, metadata가 UTF-8이라는 점을 인지해야 합니다.
Metadata 요구 사항은 USER(), CURRENT_USER(), SESSION_USER(), SYSTEM_USER(), DATABASE(), VERSION() function의 반환값이 기본적으로 UTF-8 문자 집합을 갖는다는 것을 의미합니다.
Server는 metadata 문자 집합의 이름을 character_set_system 시스템 변수에 설정합니다:
1mysql> SHOW VARIABLES LIKE 'character_set_system'; 2+----------------------+---------+ 3| Variable_name | Value | 4+----------------------+---------+ 5| character_set_system | utf8mb3 | 6+----------------------+---------+
유니코드를 사용한 metadata 저장은 server가 column header와 DESCRIBE function 결과를 기본적으로 character_set_system 문자 집합으로 반환한다는 것을 의미하지는 않습니다. SELECT column1 FROM t를 사용할 때, 이름 column1 자체는 character_set_results 시스템 변수의 값에 의해 결정되는 문자 집합으로 server에서 client로 반환되며, 이 변수의 기본값은 utf8mb4입니다.
Metadata 결과를 다른 문자 집합으로 server가 반환하게 하려면, SET NAMES 구문을 사용하여 server가 문자 집합 변환을 수행하도록 강제하십시오. SET NAMES는 character_set_results 및 기타 관련 시스템 변수를 설정합니다. (자세한 내용은 Section 12.4, “Connection Character Sets and Collations”을 참조하십시오.) 또는 client program이 server로부터 결과를 받은 후 변환을 수행할 수도 있습니다. 변환을 client에서 수행하는 것이 더 효율적이지만, 이 옵션은 모든 client에서 항상 사용 가능한 것은 아닙니다.
character_set_results가 NULL로 설정되어 있으면, 변환은 수행되지 않으며 server는 원래의 문자 집합(character_set_system이 가리키는 집합)을 사용하여 metadata를 반환합니다.
Server에서 client로 반환되는 error message는 metadata와 마찬가지로 자동으로 client 문자 집합으로 변환됩니다.
예를 들어, 하나의 구문 내에서 비교나 대입을 위해 USER() function을 사용하고 있다면 걱정할 필요가 없습니다. MySQL이 자동 변환을 일부 수행해 주기 때문입니다.
1SELECT * FROM t1 WHERE USER() = latin1_column;
이 구문은 latin1_column의 내용이 비교 전에 자동으로 UTF-8로 변환되기 때문에 동작합니다.
1INSERT INTO t1 (latin1_column) SELECT USER();
이 구문은 USER()의 내용이 대입 전에 자동으로 latin1으로 변환되기 때문에 동작합니다.
자동 변환은 SQL 표준에는 없지만, 표준은 모든 문자 집합이 (지원되는 문자 측면에서) 유니코드의 “부분집합(subset)”이라고 말합니다. “슈퍼셋에 적용되는 것은 서브셋에도 적용될 수 있다”는 것은 잘 알려진 원칙이므로, 우리는 유니코드에 대한 collation이 비유니코드 string과의 비교에도 적용될 수 있다고 봅니다. String의 강제 변환(coercion)에 대한 더 많은 정보는 Section 12.8.4, “Collation Coercibility in Expressions”을 참조하십시오.
12.2.1 Character Set Repertoire
12.3 Specifying Character Sets and Collations