メタデータとは「データについてのデータです。」データベース—の内容となっているデータではなく、データベース—について説明するデータがメタデータです。
したがって、カラム名、データベース名、ユーザ名、バージョン名のほか、SHOW
を実行して表示される文字列の多くがメタデータに該当します。
INFORMATION_SCHEMA
のテーブルコンテンツに関しても同様です。というのも、それらのテーブルにはデータベースオブジェクトに関する情報が含まれることが定義されているからです。
メタデータの表現は下記の要求を満たしていなければなりません。
すべてのメタデータはキャラクタセットが一致している必要があります。そうなっていない場合、SHOW
コマンドやINFORMATION_SCHEMA
のテーブルSELECT
ステートメントは正確には働きません。
なぜなら、これらの同じ演算結果カラムの文字列は、異なるキャラクタセットに存在するからです。
メタデータは全ての言語の全ての文字を含んでいる必要があります。そうなっていない場合、ユーザは各々の言語を使用してカラムとテーブルに名前をつけることはできません。
上記 2 つの要求を満たすために、MySQL ではメタデータが Unicode キャラクタセット(UTF8)で保存されます。これによって不具合が発生しないのは、アクセント付き文字を使用しない場合です。使用する場合、メタデータのキャラクタセットが UTF8 であることを認識する必要があります。
メタデータ要求は、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を用いたメタデータの保存は、サーバが、カラムのヘッダーやデフォルトのcharacter_set_system
キャラクタセット内の結果DESCRIBE
関数を返すということではありません。SELECT
column1 FROM
t
を使用すると、column1
の名前がそのままサーバから、character_set_results
システム変数値によって定義されるキャラクタセット(latin1
のデフォルト値)のクライアントに返されます。異なるキャラクタセットでメタデータ結果をサーバから返してほしいときは、SET
NAMES
ステートメントを使用してキャラクタセット変換を強制的に実行させましょう。SET
NAMES
はcharacter_set_results
と他の関連システム変数を設定します。(詳しくは項9.4. 「接続のキャラクタセットおよび照合順序」をご確認ください。)また、サーバから結果を受け取った後、クライアントプログラムが変換を実行することができます。クライアントが変換を実行するほうが効率的ですが、常にクライアントにオプション選択ができるわけではありません。
character_set_results
がNULL
に設定されている場合、変換は実行されず、サーバはオリジナルのキャラクタセットを使用してメタデータを返します。(設定はcharacter_set_system
によって指定されます。
サーバからクライアントへのエラーメッセージは、自動的にメタデータとしてクライアントのキャラクタセットに変換されます。
たとえばUSER()
たとえば、USER()
関数を比較または割当のために単一のステートメントで使用しているとします。
MySQL には自動変換機能が用意されています。
SELECT * FROM Table1 WHERE USER() = latin1_column;
この機能が有効なのは、latin1_column
の内容が
UTF8
へと自動的に変換されてから比較が行われるからです。
INSERT INTO Table1 (latin1_column) SELECT USER();
この機能が有効なのは、USER()
の内容が
latin1
へと自動的に変換されてから割り当てが行われるからです。自動変換機能は完全には実装されていませんが、将来のバージョンでは適切に動作する予定です。
自動変換機能は SQL 標準に含まれていません。ただし、どのキャラクタセットも(サポートされている文字に関して)Unicode の 「subset」であることが SQL 標準の文書に記載されています。「「スーパーセットに適用されるものはサブセットにも適用される」」という有名な原則があるので、Unicode の照合順序は Unicode 以外の文字列との比較にも適用できると考えられます。