メタデータは「データに関するデータ」です。データベースについて記述しているすべてのものがメタデータであり,データベースの内容ではありません。したがって,カラム名,データベース名,ユーザー名,バージョン名,および显示
の文字列結果のほとんどがメタデータです。INFORMATION_SCHEMA
内のテーブルは定義上,データベースオブジェクトに関する情報を含んでいるので,これは,このテーブルの内容にも当てはまります。
メタデータの表現は次の要件を満たしている必要があります。
すべてのメタデータで文字セットが一致している必要があります。それ以外の場合,
INFORMATION_SCHEMA
内のテーブルに対する显示
ステートメントも选择
ステートメントも正しく機能しません。これらの演算結果の同一カラム内の各行で文字セットが異なるからです。メタデータはすべての言語のすべての文字が含まれている必要があります。そうでない場合,ユーザーはそれぞれの言語を使用してカラムとテーブルに名前を付けることはできません。
両方の要件を満たすために,MySQLでは,Unicode文字セット,つまりutf - 8でメタデータを格納します。アクセント符号付きの文字またはラテン語以外の文字を使用しなければ,混乱が生じることはありません。ただし,使用した場合は,メタデータの文字セットがutf - 8であることを認識する必要があります。
このメタデータ要件は,用户()
、CURRENT_USER ()
、为SESSION_USER ()
、SYSTEM_USER ()
、数据库()
,および(版本)
の関数の戻り値で,utf - 8文字セットがデフォルトで使用されることを意味します。
サーバーは,character_set_system
システム変数をメタデータ文字セットの名前に設定します。
mysql> SHOW VARIABLES LIKE 'character_set_system';+----------------------+-------+ | Variable_name |值 | +----------------------+-------+ | character_set_system | utf8 | +----------------------+-------+
Unicodeを使用してメタデータを格納しても,サーバーが,カラムのヘッダーや描述
関数の結果を,デフォルトでcharacter_set_system
文字セットで返すことにはなりません。SELECT column1 FROM t
を使用すると,character_set_results
システム変数の値(デフォルト値はlatin1
)で特定される文字セットで,名前column1
自体がサーバーからクライアントに返されます。別の文字セットでメタデータの結果をサーバーに返させる場合は,组名称
ステートメントを使用してサーバーに文字セット変換を強制的に実行させてください。组名称
はcharacter_set_results
および関連するほかのシステム変数を設定します。(セクション10.1.4”接続文字セットおよび照合順序”を参照してください)また,サーバーから結果を受け取ったあとで,クライアントプログラムが変換を実行できます。クライアントが変換を実行するとより効率的ですが,このオプションは,すべてのクライアントが常に使用できるとはかぎりません。
character_set_results
が零
に設定されている場合,変換は実行されず,サーバーはオリジナルの文字セット(character_set_system
によって指定されたセット)を使用してメタデータを返します。
サーバーからクライアントに返されるエラーメッセージは,メタデータと同様に自動的にクライアントの文字セットに変換されます。
たとえば,用户()
関数を比較または割り当てのために単一のステートメント内で使用している場合,問題はありません。MySQLが自動的に変換を実行します。
SELECT * FROM t1 WHERE USER() = latin1_column;
これが機能するのは,latin1_column
の内容がutf - 8に自動的に変換されてから比較が行われるからです。
INSERT INTO t1 (latin1_column) SELECT USER();
これが機能するのは,用户()
の内容がlatin1
に自動的に変換されてから割り当てが行われるからです。
自動変換機能はSQL標準には含まれていません。ただし,どの文字セットも(サポートされている文字に関して)Unicodeの「サブセット」であることがSQL標準のドキュメントに記載されています。「スーパーセットに適用されるものはサブセットにも適用される」というよく知られた原則があるので,Unicodeの照合順序はUnicode以外の文字列との比較にも適用できると考えられます。文字列の強制力の詳細は,セクション10.1.7.5”式の照合順序”を参照してください。