メタデータとは「データについてのデータです。」データベース—の内容となっているデータではなく、データベース—について説明するデータがメタデータです。
したがって、カラム名、データベース名、ユーザ名、バージョン名のほか、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 以外の文字列との比較にも適用できると考えられます。
