ユーザによって定義された変数に値を保存し、後で参照することができます。これで1つのステートメントから次のステートメントに変数を移行させることができます。ユーザによって定義された変数はコネクションを指定しています。.つまり、1クライアントによって定義されたユーザ変数は他のクライアントには確認や使用ができません。特定のクライアント接続で使用されている全ての変数は、クライアントが接続を切ったときに自動的に開放されます。
ユーザ変数は@として記述され、このとき変数名var_namevar_nameは現キャラクタセット、.’、‘_’そして‘$’からなる英数字で構成される場合があります‘。デフォルトキャラクタセットはlatin1(cp1252西ヨーロッパ言語)です。これは--character-set-serverオプションでmysqldに変換されることがあります。項4.10.1. 「データおよびソート用キャラクタ セット」を参照してください。ユーザ変数名を文字列や識別子として引用符で囲む場合、他の文字を含むことができます(例:
@'my-var'、@"my-var"または@`my-var`)。
注:MySQL5.0前ではユーザ変数名は大文字と小文字が区別され、MySQL 5.0以降は区別されません。
ユーザによって定義された変数を設定する方法の1つに、SETステートメントを発行する方法が挙げられます。
SET @var_name=expr[, @var_name=expr] ...
SETでは、=もしくは:=のどちらかが代入演算子として使用できます。各々の変数に割り当てられたexprは整数、実数、文字列、もしくはNULL値を評価できます。しかし、結果セットで変数値が選択された場合、文字列としてクライアントに返されます。
SET以外のステートメントで、ユーザ変数に値を割り当てることもできます。この場合、代入演算子は:=でなくてはならず、=ではありません。これは=
が非SET
ステートメンとに置いて比較オペレータとして扱われるからです。
mysql>SET @t1=0, @t2=0, @t3=0;mysql>SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;+----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
ユーザ変数は表現が許可されているコンテキストで使用される可能性があります。これには現在、リテラル値を明確に要求するコンテキストは含まれません。例えばSELECTステートメントのLIMIT
節や、LOAD DATA
ステートメントのIGNORE
節になります。
N LINES
ユーザ変数が文字値を割り当てられた場合、それは文字列と同じキャラクタセットと照合順序になります。ユーザ変数の強制力は絶対です。(これはテーブルカラム値と同等の強制力です。)
注:SELECTステートメントでは、クライアントに送信されたときのみ表現がそれぞれ評価されます。これはつまり、HAVING、GROUP
BYもしくはORDER
BY節において、SELECTリストに設定された変数を含む表現を参照できないことを意味します。.例えば、次のステートメントは期待通りには機能しません。
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;
HAVING
節でのbに対する参照は、@aaを使用したSELECTリスト内の表現に対応するエイリアスを参照します。これは期待通りには機能しません。@aaは以前選択された行のid値を含み、現在の行から選択された値は含みません。
ユーザ変数の評価順序は定義されておらず、与えられたクエリ内の要素に基づいて変更されることがあります。SELECT
@a, @a := @a+1
...では、MySQLは@aを先に評価し次に割り当てが実行されるように見えますが、クエリの変更(例えばGROUP
BY、HAVINGまたはORDER
BY節による変更)は評価順序を変更する可能性があります。
基本的なルールは、ステートメントの一部でユーザ変数値を割り当てないことおよび同一ステートメント内の他部分で同じ変数を使用しないことです。期待通りの結果を得られるかもしれませんが、これは確約されていません。
変数の設定および同ステートメント内での使用における他の問題点は、変数のデフォルト結果型がステートメントが開始時の変数型に基づく点です。次の例で説明します。
mysql>SET @a='test';mysql>SELECT @a,(@a:=20) FROMtbl_name;
このSELECTステートメントに対して、MySQLでは、カラム1は文字列であり、@aから文字列への全てのアクセスを変換することがクライアントに通知されます。これは、@a
が2行目では数値に設定されていても行われます。SELECTステートメント実行後、@aは次のステートメントの数値として認識されます。
この問題を避けるためには、単一ステートメント内で、同変数を設定・使用してはいけません。また、変数の使用前に型を定義するために、0、0.0もしくは''に変数を設定してもいけません。
初期化されていない変数を参照する場合、それはNULL値および文字列の型が存在します。
