複数の文字セットおよび照合順序のシステム変数は、サーバーとのクライアントの通信に関係しています。これらのいくつかは、これまでのセクションですでに説明されています。
サーバー文字セットおよび照合順序は、
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 '
ステートメントは次の 3 つのステートメントと同等です。charset_name
'SET character_set_client =charset_name; SET character_set_results =charset_name; SET character_set_connection =charset_name;
character_set_connection
をcharset_name
に設定すると、collation_connection
も暗黙的にcharset_name
のデフォルト照合順序に設定されます。この照合順序を明示的に設定する必要はありません。特定の照合順序を指定するには、オプションのCOLLATE
句を使用します。SET NAMES 'charset_name' COLLATE 'collation_name'
SET CHARACTER SET
charset_name
SET CHARACTER SET
はSET NAMES
に似ていますが、character_set_connection
とcollation_connection
をcharacter_set_database
とcollation_database
に設定します。SET CHARACTER SET
ステートメントは次の 3 つのステートメントと同等です。charset_name
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
を明示的に設定する必要はありません。
ucs2
、utf16
、utf16le
、およびutf32
をクライアント文字セットとして使用することはできません。つまり、これらはSET NAMES
またはSET CHARACTER SET
には機能しません。
MySQL クライアントプログラムmysql
、mysqladmin
、mysqlcheck
、mysqlimport
、およびmysqlshow
は、次のように、使用するデフォルトの文字セットを特定します。
ほかの情報が欠如している場合、プログラムは、コンパイル時のデフォルトの文字セット (通常は
latin1
) を使用します。プログラムは、オペレーティングシステム設定 (たとえば、Unix システムでは
LANG
やLC_ALL
ローカル環境変数の値、Windows システムではコードページ設定) に基づいて、使用する文字セットを自動検出できます。ロケールが OS から利用できるシステムの場合、クライアントはコンパイル時のデフォルトを使用するのではなく、このロケールを使用してデフォルトの文字セットを設定します。たとえば、LANG
をru_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_client
、character_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が使用するデフォルトの文字セットも変更します。
例:column1
がCHAR(5) CHARACTER SET latin2
として定義されているとします。SET NAMES
またはSET CHARACTER SET
を指定しない場合、SELECT column1 FROM t
に対して、サーバーは、接続時にクライアントが指定した文字セットを使用して、column1
のすべての値を送り返します。反対に、SET NAMES 'latin1'
またはSET CHARACTER SET latin1
をSELECT
ステートメントを発行する前に指定した場合、サーバーは結果を返信する直前に、latin2
の値をlatin1
に変換します。両方の文字セットに存在しない文字がある場合、変換の損失が大きくなる可能性があります。
サーバーに結果セットまたはエラーメッセージの変換を実行させない場合は、character_set_results
をNULL
またはbinary
に設定してください。
SET character_set_results = NULL;
接続に適用する文字セットおよび照合順序システム変数の値を確認するには、次のステートメントを使用してください。
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';
MySQL アプリケーションを実行する環境も考慮する必要があります。セクション10.1.5”アプリケーションの文字セットおよび照合順序の構成」を参照してください。
文字セットおよびエラーメッセージの詳細は、セクション10.1.6「エラーメッセージの文字セット」を参照してください。