各接続には接続キャラクタセットと接続照合順序があり、いずれもヌルにすることはできません。実際には 2 つの接続キャラクタセットが存在するため、両者の区別が必要な場合は ``接続/リテラル'' および ``接続/結果'' の呼称を使い分けています。
``接続'' とは、サーバへの接続時に作成されるものです。クライアントは接続を介し、SQL ステートメント(クエリなど)をサーバに送信します。サーバでは接続を介し、応答(結果セットなど)をクライアントに返します。これによって、次のような疑問が生じます。(a) クライアントから送信される際にどのキャラクタセットでクエリが送られるのか。(b) サーバではクエリを受信した後にどのキャラクタセットに変換するのか。(c) サーバでは結果セットまたはエラーメッセージをクライアントに返送する前にどのキャラクタセットに変換するのか。これらは細かく調整することができますが、デフォルトを適用することもできます。デフォルトを適用する場合、このセクションをとばしてかまいません。
接続キャラクタセットに影響するステートメントが 2 つ存在します。
SET NAMES character_set_name SET CHARACTER SET character_set_name
SET NAMES
は、クライアントから送信される SQL
ステートメントのキャラクタセットを示します。たとえば、SET
NAMES cp1251
は
「このクライアントからの入力メッセージは今後、キャラクタセット
cp1251
になります」
とサーバに通知します。サーバでは適宜、独自のキャラクタセットへと自由に変換することができます。
SET CHARACTER SET
は、クライアントから送信される SQL
ステートメントのキャラクタセットと、サーバからクライアントに返される結果セットのキャラクタセットを示します。そのため
SET CHARACTER SET
は、SET
NAMES
を含んでいるほか、たとえば
SELECT
ステートメントを使用する際にどのキャラクタセットでカラムに値が保持されるかを示します。
例:column1
が CHAR(5) CHARACTER
SET latin2
として定義されているとします。SET
CHARACTER SET
が指定されていない場合、SELECT column1 FROM
t
に対しサーバは、キャラクタセット
latin2
を使用して
column1
の値をすべて返します。一方、SET CHARACTER
SET latin1
が指定されている場合、サーバは送信前に
latin2
の値を latin1
に変換します。そのような変換は低速であり、損失につながることもあります。
SET NAMES
または SET CHARACTER
SET
の実行時には、``接続照合順序''
も変更していることになります。ただし、接続照合順序は整合性の維持のみを目的として存在しています。通常、その値は重要ではありません。
mysql
クライアントでは、起動するたびに SET
NAMES
を実行する必要はありません。--default-character-set-name
オプション設定を mysql
のコマンドラインか、オプションファイルに追加することができます。
たとえば、以下のオプション設定ファイルの設定では、mysql
を実行するたびに接続キャラクタセットが指定されます。
[mysql] default-character-set-name=character_set_name
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.