メタデータは「データに関するデータ」です。 データベースについて記述しているすべてのものがメタデータであり、データベースの内容ではありません。 したがって、カラム名、データベース名、ユーザー名、バージョン名、および 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
を使用すると、column1
自体の名前が、utf8mb4
のデフォルト値を持つ character_set_results
システム変数の値によって決定された文字セットでサーバーからクライアントに返されます。 別の文字セットでメタデータの結果をサーバーに返させる場合は、SET NAMES
ステートメントを使用してサーバーに文字セット変換を強制的に実行させてください。 SET NAMES
は character_set_results
および関連するほかのシステム変数を設定します。 (セクション10.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 の「「サブセット」」であることが示されています。 「スーパーセットに適用されるものはサブセットにも適用される」というよく知られた原則があるので、Unicode の照合順序は Unicode 以外の文字列との比較にも適用できると考えられます。 文字列の強制力の詳細は、セクション10.8.4「式での照合の強制性」を参照してください。