複数のキャラクタセットとシステム変数はサーバとクライアント間の通信に関係しています。いくつかは前セクションですでに説明されています。
サーバキャラクタセットと照合順序は、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' SET CHARACTER SETcharset_name
SET
NAMESは、クライアントから送信される SQL
ステートメントのキャラクタセットを示します。たとえば、SET
NAMES 'cp1251' は
「「このクライアントからの入力メッセージは今後、キャラクタセット
cp1251.になります」」
とサーバに通知します。加えて、クライアントに結果を返信する際サーバーが使用するべきキャラクタセットも指定します。(例えば、SELECTステートメントを使った場合どのカラム値に対してどのキャラクタセットを使用したらいいか指定します。)
SET NAMES
'ステートメントは下記の3ステートメントと等価です。
x'
SET character_set_client =x; SET character_set_results =x; SET character_set_connection =x;
character_set_connectionをxにセットするとcollation_connectionも
xのデフォルト照合順序にセットされます。その照合順序を正確にセットする必要はありません。キャラクタセットに特定の照合順序を指定するには、オプションのCOLLATE節を使用してください。
SET NAMES 'charset_name' COLLATE 'collation_name'
SET CHARACTER SET はSET
NAMESに似ていますがcharacter_set_connection
とcollation_connectionをcharacter_set_databaseとcollation_databaseにセットします。SET
CHARACTER SET
ステートメントは下記の3ステートメントと等価です。
x
SET character_set_client =x; SET character_set_results =x; SET collation_connection = @@collation_database;
collation_connectionを指定するとcharacter_set_connectionも照合順序に関係するキャラクタセットに指定されます(SET
character_set_connection =
@@character_set_databaseを実行することと同様)。character_set_connectionを正確に指定する必要はありません。
クライアント接続時、使用したいキャラクタセット名がサーバーに送られます。サーバはこのキャラクタセット名を使ってcharacter_set_client、character_set_results、そしてcharacter_set_connectionのシステム変数値を指定します。結果的に、サーバはキャラクタセット名を使用してSET
NAMESオペレーションを実行します。
デフォルト以外のキャラクタセットを使用したい場合、mysql
クライアントでは、起動するたびに SET
NAMESを実行する必要はありません。--default-character-setオプション設定をmysqlステートメントラインか、オプションファイルに追加することができます。たとえば、以下のオプション設定ファイルの設定では、mysql:を実行する度に、三つのキャラクタセット変数値をkoi8rに変更します。
[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に指定してください。
SET character_set_results = NULL;
注:現在、UCS-2
クライアントのキャラクタセットとして使用ができません。これはSET
NAMES
'ucs2'が使用できないことを意味します。
コネクションに関係するキャラクタセットや照合順序システム変数値を参照するには、下記のステートメントを使用してください。
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';
