Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

10.2.2 メタデータ用の UTF-8

メタデータデータに関するデータです。 データベースについて記述しているすべてのものがメタデータであり、データベースの内容ではありません。 したがって、カラム名、データベース名、ユーザー名、バージョン名、および SHOW の文字列結果のほとんどがメタデータです。 INFORMATION_SCHEMA 内のテーブルは定義上、データベースオブジェクトに関する情報を含んでいるので、これは、このテーブルの内容にも当てはまります。

メタデータの表現は次の要件を満たしている必要があります。

  • すべてのメタデータで文字セットが一致している必要があります。 それ以外の場合、INFORMATION_SCHEMA 内のテーブルに対する SHOW ステートメントも SELECT ステートメントも正しく機能しません。これらの演算結果の同一カラム内の各行で文字セットが異なるからです。

  • メタデータはすべての言語のすべての文字が含まれている必要があります。 そうでない場合、ユーザーはそれぞれの言語を使用してカラムとテーブルに名前を付けることはできません。

両方の要件を満たすために、MySQL では、Unicode 文字セット、つまり UTF-8 でメタデータを格納します。 アクセント符号付きの文字またはラテン語以外の文字を使用しなければ、混乱が生じることはありません。 ただし、使用した場合は、メタデータの文字セットが UTF-8 であることを認識する必要があります。

このメタデータ要件は、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 を使用してメタデータを格納しても、サーバーが、カラムのヘッダーや DESCRIBE 関数の結果を、デフォルトで character_set_system 文字セットで返すことにはなりませんSELECT column1 FROM t を使用すると、column1 自体の名前が、utf8mb4 のデフォルト値を持つ character_set_results システム変数の値によって決定された文字セットでサーバーからクライアントに返されます。 別の文字セットでメタデータの結果をサーバーに返させる場合は、SET NAMES ステートメントを使用してサーバーに文字セット変換を強制的に実行させてください。 SET NAMEScharacter_set_results および関連するほかのシステム変数を設定します。 (セクション10.4「接続文字セットおよび照合順序」を参照してください。) また、サーバーから結果を受け取ったあとで、クライアントプログラムが変換を実行できます。 クライアントが変換を実行するとより効率的ですが、このオプションは、すべてのクライアントが常に使用できるとはかぎりません。

character_set_resultsNULL に設定されている場合、変換は実行されず、サーバーはオリジナルの文字セット (character_set_system によって指定されたセット) を使用してメタデータを返します。

サーバーからクライアントに返されるエラーメッセージは、メタデータと同様に自動的にクライアントの文字セットに変換されます。

たとえば、USER() 関数を比較または割り当てのために単一のステートメント内で使用している場合、問題はありません。 MySQL が自動的に変換を実行します。

SELECT * FROM t1 WHERE USER() = latin1_column;

これが機能するのは、latin1_column の内容が UTF-8 に自動的に変換されてから比較が行われるからです。

INSERT INTO t1 (latin1_column) SELECT USER();

これが機能するのは、USER() の内容が latin1 に自動的に変換されてから割り当てが行われるからです。

自動変換は SQL 標準には含まれていませんが、標準では、すべての文字セットが Unicode の「サブセット」であることが示されています。 スーパーセットに適用されるものはサブセットにも適用されるというよく知られた原則があるので、Unicode の照合順序は Unicode 以外の文字列との比較にも適用できると考えられます。 文字列の強制力の詳細は、セクション10.8.4「式での照合の強制性」を参照してください。