SET variable_assignment [, variable_assignment] ...
variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| [@@GLOBAL. | @@SESSION. | @@]system_var_name = expr
SET
ステートメントは、サーバーまたはクライアントの操作に影響を与える各種の変数に値を割り当てます。
このセクションでは、変数に値を割り当てるための SET
の使用について説明します。SET
ステートメントを使用すると、次の種類の変数に値を割り当てることができます。
-
システム変数。セクション5.1.4「サーバーシステム変数」を参照してください。システム変数はまた、セクション5.1.5「システム変数の使用」で説明されているように、サーバーの起動時にも設定できます。
ユーザー定義変数。セクション9.4「ユーザー定義変数」を参照してください。
ストアドプロシージャーやストアドファンクションのパラメータ、およびストアドプログラムのローカル変数。セクション13.6.4「ストアドプログラム内の変数」を参照してください。
ほかのコンテキストでは、SET
構文のいくつかのバリアントが使用されます。
SET CHARACTER SET
とSET NAMES
は、サーバーへの接続に関連付けられた文字セットおよび照合順序変数に値を割り当てます。SET ONE_SHOT
は、レプリケーションに使用されます。これらのバリアントについては、このセクションのあとの方で説明されています。SET PASSWORD
は、アカウントのパスワードを割り当てます。セクション13.7.1.7「SET PASSWORD 構文」を参照してください。SET TRANSACTION ISOLATION LEVEL
は、トランザクション処理の分離レベルを設定します。セクション13.3.6「SET TRANSACTION 構文」を参照してください。
次の説明は、変数を設定するために使用できる各種の SET
構文を示しています。これらの例では =
割り当て演算子を使用していますが、この目的には :=
割り当て演算子も使用できます。
ユーザー変数は @
として記述され、次のように設定できます。
var_name
SET @var_name = expr;
多くのシステム変数は動的であり、SET
ステートメントを利用してサーバーが実行している間に変更できます。リストついては、セクション5.1.5.2「動的システム変数」を参照してください。SET
を利用してシステム変数を変更するには、任意で修飾子が先行する var_name
としてシステム変数を参照してください。
変数がグローバル変数であることを明示的に指示するためには、その名前の前に
GLOBAL
または@@GLOBAL.
を付けます。グローバル変数を設定するにはSUPER
権限が必要です。変数がセッション変数であることを明示的に指示するには、その名前の前に
SESSION
、@@SESSION.
、または@@
を付けます。セッション変数を正常に設定するために特殊な権限は必要ありません。ただし、例外があります (sql_log_bin
など)。クライアントは自分のセッション変数を変更できますが、ほかのどのクライアントのセッション変数も変更できません。LOCAL
と@@LOCAL.
はSESSION
と@@SESSION.
のシノニムです。修飾子が何もなければ、
SET
はセッション変数を変更します。
SET
ステートメントは、カンマで区切られた複数の変数割り当てを含むことができます。たとえば、ステートメントは、ユーザー定義変数やシステム変数に値を割り当てることができます。複数のシステム変数を設定した場合、ステートメント内のいちばん最近の GLOBAL
または SESSION
修飾子が、指定された修飾子を持たない後続の変数に利用されます。
例:
SET sort_buffer_size=10000;
SET @@LOCAL.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@GLOBAL.sort_buffer_size=1000000, @@LOCAL.sort_buffer_size=1000000;
システム変数の @@
構文では、ほかの一部のデータベースシステムとの互換性をサポートしています。
var_name
セッションシステム変数を変更すると、セッションが終了するまで、または変数を異なる値に変更するまではその値は有効になります。別のクライアントは変更を見ることができません。
グローバルシステム変数を変更すると、その値はサーバーが再起動するまでの間記憶され、新しい接続に利用されます。(グローバルシステム変数を永続的に設定するには、オプションファイルに設定する必要があります。)そのグローバル変数にアクセスするすべてのクライアントが変更を確認できます。ただし変更は、変更後に接続するクライアントの対応するセッション変数にのみ影響を与えます。グローバル変数の変更は、現在接続中のクライアントのセッション変数に影響を与えません (SET GLOBAL
ステートメントを発行するクライアントのセッション変数にも影響を与えません)。
誤用を防ぐために、SET SESSION
とのみ利用できる変数とともに SET GLOBAL
を使用したり、グローバル変数の設定時に GLOBAL
(または @@GLOBAL.
) を指定しなかったりした場合に、MySQL でエラーが生じます。
SESSION
変数を GLOBAL
値に設定したり、GLOBAL
値をコンパイル時の MySQL のデフォルト値に設定したりするには、DEFAULT
キーワードを使用します。たとえば、次の 2 つのステートメントは、max_join_size
のセッション値をグローバル値に設定する上で同一です。
SET max_join_size=DEFAULT;
SET @@SESSION.max_join_size=@@GLOBAL.max_join_size;
すべてのシステム変数を DEFAULT
に設定できるわけではありません。そのような場合、DEFAULT
を使用するとエラーが発生します。
ユーザー定義変数、ストアドプロシージャーやストアドファンクションのパラメータ、またはストアドプログラムのローカル変数に値 DEFAULT
を割り当てることは許可されません。ユーザー定義変数の場合、これは構文エラーになります。また、MySQL 5.6.6 の時点では、パラメータまたはローカル変数の場合も同様です。
いずれかの @@
修飾子を使用することによって、特定のグローバルシステム変数またはセッションシステム変数の値を式で参照できます。たとえば、次のようにして SELECT
ステートメントで値を取得できます。
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
@@
のような式でシステム変数を参照するとき (つまり、var_name
@@GLOBAL.
または @@SESSION.
を指定しない場合)、MySQL はセッション値が存在すればそれを返し、それ以外の場合はグローバル値を返します。(これは、常にセッション値を参照する SET @@
とは異なります。)
var_name
= value
SHOW VARIABLES
によって表示される一部の変数は、SELECT @@
構文で使用できない場合があり、var_name
「不明なシステム変数です」
と表示されます。その場合の回避方法として、SHOW VARIABLES LIKE '
を使用できます。
var_name
'
値乗数を指定するサフィクスは、サーバーの起動時に変数を設定するときに使用できますが、実行時に SET
で値を設定するためには使用できません。一方、SET
を使用すると、式を使用して変数の値を割り当てることができますが、サーバーの起動時に変数を設定するときには使用できません。たとえば、サーバーの起動時に次の 1 行目は有効ですが 2 行目は無効です。
shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=16*1024*1024
逆に、実行時に次の 2 行目は有効ですが 1 行目は無効です。
mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
システム変数の名前と値を表示するには、SHOW VARIABLES
ステートメントを使用します。(セクション13.7.5.40「SHOW VARIABLES 構文」を参照してください。)
次のリストは、標準以外の構文を持つ SET
オプション (つまり、
構文では設定されないオプション) を示しています。
name
= value
-
CHARACTER SET {
charset_name
| DEFAULT}これは、マッピングが指定されているすべての文字列をクライアントとの間でマップします。MySQL ソース配布内の
sql/convert.cc
を編集することによって、新しいマッピングを追加できます。SET CHARACTER SET
は、3 つのセッションシステム変数を設定します。character_set_client
とcharacter_set_results
は指定された文字セットに設定され、character_set_connection
はcharacter_set_database
の値に設定されます。セクション10.1.4「接続文字セットおよび照合順序」を参照してください。デフォルトのマッピングは、値
DEFAULT
を使用してリストアできます。このデフォルトは、サーバー構成によって異なります。ucs2
、utf16
、およびutf32
は、クライアント文字セットとして使用できません。つまり、これらはSET CHARACTER SET
では機能しません。 -
NAMES {'
charset_name
' [COLLATE 'collation_name
'] | DEFAULT}SET NAMES
は、3 つのセッションシステム変数character_set_client
、character_set_connection
、およびcharacter_set_results
を指定された文字セットに設定します。character_set_connection
をcharset_name
に設定すると、collation_connection
もcharset_name
のデフォルトの照合順序に設定されます。オプションのCOLLATE
句を使用すると、照合順序を明示的に指定できます。セクション10.1.4「接続文字セットおよび照合順序」を参照してください。デフォルトのマッピングは、
DEFAULT
の値を使用してリストアできます。このデフォルトは、サーバー構成によって異なります。ucs2
、utf16
、およびutf32
は、クライアント文字セットとして使用できません。つまり、これらはSET NAMES
では機能しません。 -
ONE_SHOT
は、内部でのみ使用されます。これは、MySQL 5.0 から非推奨であり、MySQL 5.6.1 で削除されました。