メタデータとは、データについてのデータです。データベースの内容となっているデータではなく、データベースについて説明するデータがメタデータです。したがって、カラム名、データベース名、ユーザ名、バージョン名のほか、SHOW を実行して表示される文字列の多くがメタデータに該当します。
すべてのメタデータはキャラクタセットが一致している必要があります(そうなっていない場合、SHOW は正しく実行されるとは限りません。同じカラムに含まれる個々のレコードのキャラクタセットが一致しない可能性があるからです)。一方、すべての言語によるすべての文字がメタデータに含まれている必要があります(そうなっていない場合、ユーザがカラムやテーブルの名称を母国語で設定できない可能性があります)。上記 2 つの目的を考慮するため、MySQL ではメタデータが Unicode キャラクタセット(UTF8)で保存されます。これによって不具合が発生しないのは、アクセント付き文字を使用しない場合です。使用する場合、メタデータのキャラクタセットが UTF8 であることを認識する必要があります。
つまり、USER()(およびそのシノニム SESSION_USER() と SYSTEM_USER())、CURRENT_USER()、VERSION() の各関数では、UTF8 キャラクタセットがデフォルトで使用されます。
ただし、カラムのヘッダと DESCRIBE 関数の実行結果がデフォルトで UTF8 キャラクタセットになるということではありません (
SELECT column1 FROM t と指定すると、名称 column1 自体がクライアントのキャラクタセットによりサーバからクライアントに返されます。このキャラクタセットは、SET NAMES ステートメントで決定されたものです)。
サーバからメタデータの結果が UTF8 以外のキャラクタセットで返されるようにするには、(see 項9.3.6. 「接続のキャラクタセットおよび照合順序」)の変換を SET CHARACTER SET によってサーバに実行させるか、変換がクライアントで実行されるように設定します。クライアントに変換を実行させる方が常に効率的ですが、このオプションは MySQL 4.x の製品サイクル後期まで使用することができません。
たとえば、USER() 関数を比較または割当のために単一のステートメントで使用しているとします。
MySQL には自動変換機能が用意されています。
SELECT * FROM Table1 WHERE USER() = latin1_column;
この機能が有効なのは、latin1_column の内容が UTF8 へと自動的に変換されてから比較が行われるからです。
INSERT INTO Table1 (latin1_column) SELECT USER();
この機能が有効なのは、USER() の内容が latin1 へと自動的に変換されてから割当が行われるからです。
自動変換機能は完全には実装されていませんが、将来のバージョンでは適切に動作する予定です。
自動変換機能は SQL 標準に含まれていません。ただし、どのキャラクタセットも(サポートされている文字に関して)Unicode の ``サブセット'' であることが SQL 標準の文書に記載されています。「スーパーセットに適用されるものはサブセットにも適用される」という有名な原則があるので、Unicode の照合順序は Unicode 以外の文字列との比較にも適用できると考えられます。
バージョン 4.1.1 注意:この時点から、errmsg.txt ファイルはすべて UTF8 になります。クライアントのキャラクタセットへの変換は、メタデータに関しては自動的に行われます。結果セットを返す場合のデフォルトの動作を変更することができます。