SETvariable_assignment
[,variable_assignment
] ...variable_assignment
:user_var_name
=expr
| [GLOBAL | SESSION]system_var_name
=expr
| [@@global. | @@session. | @@]system_var_name
=expr
SET
ステートメントは、サーバーやクライアントの操作に影響を与える、様々な型の変数に値を割り当てます。MySQL
の古いバージョンは SET
OPTION
を採用していましたが、OPTION
を持たない SET
がより好まれるようになったため、この構文は廃止されることになりました。
この節では、システム変数やユーザー変数に値を割り当てる
SET
の利用について説明します。これらの型の変数に関する一般的な情報については、Server System Variables、Session System Variables、および
項5.4. 「ユーザー定義変数」
を参照してください。システム変数も、Using System Variables
で説明されているように、サーバー起動時に設定することができます。
SET
構文バリアントのいくつかが、別のコンテキストで利用されています。
SET CHARACTER SET
および SET NAMES
は、サーバーへの接続に関連付けられたキャラクタセットおよび照合変数に値を割り当てます。SET
ONESHOT
は、レプリケーションに使用されます。これらのバリアントについては、この節のあとの方で説明します。
SET PASSWORD
はアカウントパスワードを割り当てます。項8.5.1.6. 「SET PASSWORD
構文」
を参照してください。
SET
TRANSACTION ISOLATION LEVEL
はトランザクションプロセスに遮断レベルを設定します。項8.4.6. 「SET TRANSACTION
構文」
を参照してください。
SET
は、ローカルルーチン変数に値を割り当てるためのストアドルーチン内で利用されます。項8.8.3.2. 「変数 SET
ステートメント」
を参照してください。
次の説明は、変数を設定するために利用することができる、異なる
SET
構文を表しています。例では
=
代入演算子を利用していますが、:=
演算子も許容されています。
ユーザー変数は
@
として記述され、次のように設定できます。
var_name
SET @var_name
=expr
;
多くのシステム変数は動的であり、SET
ステートメントを利用してサーバーが起動している間に変更することができます。(リストついては、Dynamic System Variables
をご覧ください)。SET
を利用してシステム変数を変更するには、任意で修飾子が先行する
var_name
として参照してください。
変数がグローバルであることを明示的に指示するためには、その名前に
GLOBAL
か
@@global.
を先行させてください。SUPER
権限はグローバル変数を設定するために要求されます。
変数がセッションであることを明示的に指示するためには、その名前に
SESSION
か
@@global.
を先行させてください。セッション変数を設定するのに特別な権限は必要とされませんが、クライアントは自分自身のセッション変数以外は変更できませんので、別のクライアントのものは変更できません。
LOCAL
と
@@local.
は
SESSION
と
@@session.
の同義語です。
もし修飾子が何もなければ、SET
はセッション変数を変更します。
A
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
GLOBAL
を
SET
SESSION
とだけ利用できる変数と共に利用したり、グローバル変数を設定するときに
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
の利用はエラーを引き起こします。
@@
修飾子の 1
つを利用することで、式の中の特定のグローバル、またはシステム変数の値を参照することができます。たとえば、このようにして
SELECT
ステートメント内の値を検索することができます。
SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;
@@
(var_name
@@global.
か@@session.
を指定しない場合)
のような式でシステム変数を参照するとき、MySQL
はセッション値が存在すればそれを返し、そうでなければグローバル値を返します。(これは、常にセッション値を参照する
SET
@@
とは異なります。)
var_name
=
value
SHOW VARIABLES
によって表示される一部の変数が、SELECT
@@
構文では使用できない可能性があります。var_name
Unknown
system variable
が発生します。その場合の回避方法として、SHOW
VARIABLES LIKE '
を使用できます。
var_name
'
値乗数を指定するための接尾辞が、サーバーの起動時に変数を設定するときに使用できますが、実行時に
SET
で値を設定するためには使用できません。一方、SET
を使用すると、式を使用して変数の値を割り当てることができます。これは、サーバーの起動時に変数を設定するときには当てはまりません。たとえば、サーバーの起動時に次の行の最初は正当ですが、2
番目は正当ではありません。
shell>mysql --max_allowed_packet=16M
shell>mysql --max_allowed_packet=16*1024*1024
逆に、実行時に次の行の 2 番目は正当ですが、最初は正当ではありません。
mysql>SET GLOBAL max_allowed_packet=16M;
mysql>SET GLOBAL max_allowed_packet=16*1024*1024;
システム変数名と値を表示するには、SHOW
VARIABLES
ステートメントを利用してください。(詳しくは
項8.5.5.41. 「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
の値に設定されます。Connection Character Sets and Collations
を参照してください。
デフォルトのマッピングは、値
DEFAULT
を利用することで復旧できます。デフォルトはサーバーの設定によって決まります。
ucs2
は、クライアントのキャラクタセットとして使用できません。つまり、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
節は照合を明示的に指定するのに利用されるでしょう。Connection Character Sets and Collations
を参照してください。
デフォルトのマッピングは、値
DEFAULT
を利用することで復旧できます。デフォルトはサーバーの設定によって決まります。
ucs2
は、クライアントのキャラクタセットとして使用できません。つまり、SET
NAMES
に対しては機能しません。
このオプションは変数ではなく修飾子です。これは、キャラクタセット、照合、そしてタイムゾーンを設定する変数の効果に影響を与えるために利用することができます。ONE_SHOT
は主にレプリケーションを目的として利用されます。キャラクタセット、照合、そしてタイムゾーン変数の値をロールフォーワードで元の形を反映させるために、mysqlbinlog
はそれらをテンポラリに修正できるよう
SET ONE_SHOT
を利用します。ONE_SHOT
は内部的な利用のためだけのもので、MySQL 5.0
以降のバージョンでは廃止予定です。
ONE_SHOT
を許容された変数のセット以外のものと利用することはできません。もし利用を試みると、次のようなエラーが発生します。
mysql> SET ONE_SHOT max_allowed_packet = 1;
ERROR 1382 (HY000): The 'SET ONE_SHOT' syntax is reserved for purposes
internal to the MySQL server
もし ONE_SHOT
が許容された変数と共に利用されたら、それは要求されたとおりに変数を変更しますが、それは次の非
SET
ステートメントに対してのみ行われます。その後、サーバーはすべてのキャラクタセット、照合、そしてタイムゾーンに関連したシステム変数を、以前の値に再設定します。例
:
mysql>SET ONE_SHOT character_set_connection = latin5;
mysql>SET ONE_SHOT collation_connection = latin5_turkish_ci;
mysql>SHOW VARIABLES LIKE '%_connection';
+--------------------------+-------------------+ | Variable_name | Value | +--------------------------+-------------------+ | character_set_connection | latin5 | | collation_connection | latin5_turkish_ci | +--------------------------+-------------------+ mysql>SHOW VARIABLES LIKE '%_connection';
+--------------------------+-------------------+ | Variable_name | Value | +--------------------------+-------------------+ | character_set_connection | latin1 | | collation_connection | latin1_swedish_ci | +--------------------------+-------------------+