10bet网址
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr)- 26.8Mb
PDF (A4)- 26.8Mb


10.1.4 接続文字セットおよび照合順序

複数の文字セットおよび照合順序のシステム変数は、サーバーとのクライアントの通信に関係しています。これらのいくつかは、これまでのセクションですでに説明されています。

  • サーバー文字セットおよび照合順序は、character_set_serverおよびcollation_serverシステム変数の値です。

  • デフォルトのデータベースの文字セットおよび照合順序は、character_set_databaseおよびcollation_databaseシステム変数の値です。

その他の文字セットおよび照合順序システム変数は、クライアントとサーバー間の接続のトラフィックの処理に関わっています。どのクライアントも接続関連の文字セットおよび照合順序システム変数を持っています。

接続は、サーバーに接続するときに作成するものです。クライアントは接続を介して、SQL ステートメント (クエリーなど) をサーバーに送信します。サーバーは接続を介して、結果セットやエラーメッセージなどの応答をクライアントに送信します。これによって、次のようなクライアント接続を扱う文字セットおよび照合順序に関する疑問が生じますが、これらはシステム変数の点から回答できます。

  • クライアントから送信されるときに、ステートメントはどの文字セットで送信されますか。

    サーバーは、character_set_clientシステム変数値を、クライアントが送信するステートメントの文字セットにします。

  • ステートメントを受信したあとで、サーバーはこれをどの文字セットに変換しますか。

    これには、サーバーはcharacter_set_connectionおよびcollation_connectionシステム変数値を使用します。クライアントから送信されたステートメントは、character_set_clientからcharacter_set_connectionに変換されます (_latin1_utf8などのイントロデューサがある文字列リテラルを除きます)。collation_connectionはリテラル文字列の比較で重要です。カラム値のある文字列の比較には、collation_connectionは重要視されません。なぜなら、カラムには独自の照合順序があり、この照合順序が優先されるからです。

  • 結果セットまたはエラーメッセージをクライアントに返送する前に、サーバーはこれらをどの文字セットに変換しますか。

    character_set_resultsシステム変数値は、サーバーがクライアントにクエリー結果を返信するときに使用する文字セットを示します。これには、カラム値などの結果データと、カラム名やエラーメッセージなどの結果メタデータが含まれます。

クライアントは、これらの変数の設定を微調整することも、デフォルトに従うこともできます (この場合は、このセクションの残りをスキップできます)。デフォルトを使用しない場合、サーバーへの接続ごとに文字設定を変更する必要があります。

2 つのステートメントは、接続関連の文字セット変数にグループとして影響します。

  • SET NAMES 'charset_name' [COLLATE 'collation_name']

    SET NAMESは、クライアントからサーバーへの SQL ステートメントの送信に使用される文字セットを示します。したがって、SET NAMES 'cp1251'は、このクライアントから今後受信するメッセージが文字セットcp1251で送信されることを、サーバーに知らせます。また、クライアントに結果を返信するときにサーバーが使用する文字セットも指定します。(たとえば、SELECTステートメントを使用する場合に、カラム値に使用する文字セットを指定します。)

    SET NAMES 'charset_name'ステートメントは次の 3 つのステートメントと同等です。

    SET character_set_client =charset_name; SET character_set_results =charset_name; SET character_set_connection =charset_name;

    character_set_connectioncharset_nameに設定すると、collation_connectionも暗黙的にcharset_nameのデフォルト照合順序に設定されます。この照合順序を明示的に設定する必要はありません。特定の照合順序を指定するには、オプションのCOLLATE句を使用します。

    SET NAMES 'charset_name' COLLATE 'collation_name'
  • SET CHARACTER SETcharset_name

    SET CHARACTER SETSET NAMESに似ていますが、character_set_connectioncollation_connectioncharacter_set_databasecollation_databaseに設定します。SET CHARACTER SETcharset_nameステートメントは次の 3 つのステートメントと同等です。

    SET character_set_client =charset_name; SET character_set_results =charset_name; SET collation_connection = @@collation_database;

    collation_connectionを設定すると、character_set_connectionも、関連付けられた文字セットに暗黙的に設定されます (SET character_set_connection = @@character_set_databaseの実行と同等です)。character_set_connectionを明示的に設定する必要はありません。

注記

ucs2utf16utf16le、およびutf32をクライアント文字セットとして使用することはできません。つまり、これらはSET NAMESまたはSET CHARACTER SETには機能しません。

MySQL クライアントプログラムmysqlmysqladminmysqlcheckmysqlimport、およびmysqlshowは、次のように、使用するデフォルトの文字セットを特定します。

  • ほかの情報が欠如している場合、プログラムは、コンパイル時のデフォルトの文字セット (通常はlatin1) を使用します。

  • プログラムは、オペレーティングシステム設定 (たとえば、Unix システムではLANGLC_ALLローカル環境変数の値、Windows システムではコードページ設定) に基づいて、使用する文字セットを自動検出できます。ロケールが OS から利用できるシステムの場合、クライアントはコンパイル時のデフォルトを使用するのではなく、このロケールを使用してデフォルトの文字セットを設定します。たとえば、LANGru_RU.KOI8-Rに設定すると、koi8r文字セットが使用されます。したがってユーザーは、MySQL クライアントが使用できるように、自身の環境内でロケールを構成できます。

    OS 文字セットは、正確に一致するものがない場合は、もっとも近い MySQL 文字セットにマップされます。一致した文字セットをサポートしていない場合、クライアントはコンパイルイ時のデフォルトを使用します。たとえば、ucs2は接続文字セットとしてはサポートされていません。

    C アプリケーションは、サーバーに接続する前に次のようにmysql_options()を呼び出すことによって、OS 設定に基づいて文字セットの自動検出を使用できます。

    mysql_options(mysql, MYSQL_SET_CHARSET_NAME, MYSQL_AUTODETECT_CHARSET_NAME);
  • プログラムは--default-character-setオプションをサポートしており、ユーザーはこのオプションを使用すると文字セットを明示的に指定でき、クライアントがそれ以外のどのデフォルトを指定していても、それをオーバーライドできます。

クライアントはサーバーに接続するときに、使用する文字セットの名前を送信します。サーバーはこの名前を使用して、character_set_clientcharacter_set_results、およびcharacter_set_connectionシステム変数を設定します。実際には、サーバーは文字セット名を使用してSET NAMES操作を実行します。

mysqlクライアントの場合、デフォルトとは別の文字セットを使用するには、起動するたびに、SET NAMESを明示的に実行できます。より簡単に同じ結果を得るには、--default-character-setオプション設定をmysqlコマンド行またはオプションファイルに追加します。たとえば、次のオプションファイル設定は、mysqlを呼び出すたびに、koi8rに設定された 3 つの接続関連の文字セット変数を変更します。

[mysql] default-character-set=koi8r

自動再接続を有効にしてmysqlクライアントを使用している場合は (推奨しません)、SET NAMESではなくcharsetコマンドを使用することをお勧めします。例:

mysql> charset utf8 Charset changed

charsetコマンドは、SET NAMESステートメントを発行し、接続の切断後に再接続するときにmysqlが使用するデフォルトの文字セットも変更します。

例:column1CHAR(5) CHARACTER SET latin2として定義されているとします。SET NAMESまたはSET CHARACTER SETを指定しない場合、SELECT column1 FROM tに対して、サーバーは、接続時にクライアントが指定した文字セットを使用して、column1のすべての値を送り返します。反対に、SET NAMES 'latin1'またはSET CHARACTER SET latin1SELECTステートメントを発行する前に指定した場合、サーバーは結果を返信する直前に、latin2の値をlatin1に変換します。両方の文字セットに存在しない文字がある場合、変換の損失が大きくなる可能性があります。

サーバーに結果セットまたはエラーメッセージの変換を実行させない場合は、character_set_resultsNULLまたはbinaryに設定してください。

SET character_set_results = NULL;

接続に適用する文字セットおよび照合順序システム変数の値を確認するには、次のステートメントを使用してください。

SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';

MySQL アプリケーションを実行する環境も考慮する必要があります。セクション10.1.5”アプリケーションの文字セットおよび照合順序の構成」を参照してください。

文字セットおよびエラーメッセージの詳細は、セクション10.1.6「エラーメッセージの文字セット」を参照してください。