複数のキャラクタセットとシステム変数はサーバとクライアント間の通信に関係しています。いくつかは前セクションですでに説明されています。
サーバキャラクタセットと照合順序は、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%';