メタデータとは、データについてのデータです。データベースの内容となっているデータではなく、データベースについて説明するデータがメタデータです。したがって、カラム名、データベース名、ユーザ名、バージョン名のほか、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
になります。クライアントのキャラクタセットへの変換は、メタデータに関しては自動的に行われます。結果セットを返す場合のデフォルトの動作を変更することができます。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.