Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


13.7.4 SET 構文

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 ステートメントを使用すると、次の種類の変数に値を割り当てることができます。

ほかのコンテキストでは、SET 構文のいくつかのバリアントが使用されます。

  • SET CHARACTER SETSET 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_clientcharacter_set_results は指定された文字セットに設定され、character_set_connectioncharacter_set_database の値に設定されます。セクション10.1.4「接続文字セットおよび照合順序」を参照してください。

    デフォルトのマッピングは、値 DEFAULT を使用してリストアできます。このデフォルトは、サーバー構成によって異なります。

    ucs2utf16、および utf32 は、クライアント文字セットとして使用できません。つまり、これらは SET CHARACTER SET では機能しません。

  • NAMES {'charset_name' [COLLATE 'collation_name'] | DEFAULT}

    SET NAMES は、3 つのセッションシステム変数 character_set_clientcharacter_set_connection、および character_set_results を指定された文字セットに設定します。character_set_connectioncharset_name に設定すると、collation_connectioncharset_name のデフォルトの照合順序に設定されます。オプションの COLLATE 句を使用すると、照合順序を明示的に指定できます。セクション10.1.4「接続文字セットおよび照合順序」を参照してください。

    デフォルトのマッピングは、DEFAULT の値を使用してリストアできます。このデフォルトは、サーバー構成によって異なります。

    ucs2utf16、および utf32 は、クライアント文字セットとして使用できません。つまり、これらは SET NAMES では機能しません。

  • ONE_SHOT

    ONE_SHOT は、内部でのみ使用されます。これは、MySQL 5.0 から非推奨であり、MySQL 5.6.1 で削除されました。


User Comments
  Posted by George Marshall on June 14, 2014
When using the multiple variable assignment syntax, none of the assignments can depend on the results of the other assignments. For example, the variable @d will not be assigned a value:

set @c=1, @d=@c+1;
select @c, @d; # @d will be null
Sign Up Login You must be logged in to post a comment.