このセクションでは、サーバーがエラーメッセージを構築しクライアントに返信する場合にどのように文字セットを使用するかについて説明します。エラーメッセージの (文字セットではなく) 言語の詳細は、セクション10.2「エラーメッセージ言語の設定」を参照してください。
MySQL 5.6 では、サーバーは、UTF-8 を使用してエラーメッセージを構築し、character_set_results
システム変数で指定された文字セットでクライアントに返信します。
サーバーは次のようにエラーメッセージを構築します。
メッセージテンプレートで UTF-8 が使用されます。
-
メッセージテンプレートのパラメータが、特定のエラーの発生に適用される値に置き換えられます。
テーブル名やカラム名などの識別子は、UTF-8 を内部で使用するので、そのままコピーされます。
文字 (非バイナリ) 文字列値は、その文字セットから UTF-8 に変換されます。
-
バイナリ文字列値は、
0x20
から0x7E
の範囲のバイトについてはそのままコピーされ、この範囲外のバイトについては\x
16 進エンコーディングを使用してコピーされます。たとえば、0x41CF9F
をVARBINARY
一意カラムに挿入しようとしたときに重複キーエラーが発生した場合、この結果生成されるエラーメッセージでは UTF-8 が使用され、一部のバイトは 16 進数でエンコードされます。Duplicate entry 'A\xC3\x9F' for key 1
メッセージの構築後、これをクライアントに返すために、サーバーはこのメッセージを UTF-8 から、character_set_results
システム変数によって指定された文字セットに変換します。character_set_results
に NULL
または binary
の値がある場合、変換は行われません。変数値が utf8
である場合にも、これが元のエラーメッセージの文字セットに一致するので、変換は行われません。
character_set_results
で表すことができない文字の場合、変換中に一部のエンコーディングが行われることがあります。エンコーディングは、Unicode コードポイント値を使用します。
Basic Multilingual Plane (BMP) 範囲 (
0x0000
から0xFFFF
) 内の文字は、\
表記を使用して書き込まれます。nnnn
BMP 範囲外 (
0x01000
から0x10FFFF
) の文字は、\+
表記を使用して書き込まれます。nnnnnn
クライアントは、character_set_results
を設定して、エラーメッセージを受信するときの文字セットを制御できます。この変数は直接設定することも、SET NAMES
などの手段で間接的に設定することもできます。character_set_results
の詳細は、セクション10.1.4「接続文字セットおよび照合順序」を参照してください。
クライアントにエラーメッセージを返信する前に character_set_results
に変換する間に行われるエンコーディングの結果、以前のバージョン (MySQL 5.5 より前のバージョン) とは異なるメッセージ内容になることがあります。たとえば、ペ
(カタカナのペ) という名前のテーブルを削除しようとしたときにエラーが発生し、character_set_results
が、この文字を含まない latin1
などの文字セットである場合、クライアントに送信される結果のメッセージには、次のようにエンコードされたテーブル名が表示されます。
ERROR 1051 (42S02): Unknown table '\30DA'
MySQL 5.5 より前では、次のように名前はエンコードされません。
ERROR 1051 (42S02): Unknown table 'ペ'