MySQL では、@variablename
構文での接続ごとのユーザ変数をサポートしています。変数名は、現在のキャラクタセット内の英数字、および
‘_
’、‘$
’、‘.
’
で構成することができます。デフォルトのキャラクタセットは
ISO-8859-1 Latin1
です。このキャラクタセットは、--default-character-set
オプションを指定した mysqld
で変更可能です。See
項4.7.1. 「データおよびソート用キャラクタセット」。ユーザ変数名は、バージョン
5.0
以降のバージョンではケース非依存で、バージョン
5.0 より前のバージョンではケース依存です。
変数は初期化する必要はありません。変数の値はデフォルトでは
NULL
であり、整数、実数、または文字列値を格納することができます。スレッドのすべての変数は、そのスレッドが終了すると自動的に解放されます。
変数は SET
構文を使用して設定することができます。
SET @variable= { integer expression | real expression | string expression } [,@variable= ...].
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 number LINES
節など、数値が明示的に要求されている文脈での使用は含まれません。
注意:
SELECT
文においては、それぞれの式は、クライアントに送られた時にはじめて評価されます。したがって、HAVING
、GROUP
BY
、ORDER BY
節において、SELECT
部に設定された変数を含む式を参照することはできません。たとえば、次の文は、期待どおりに機能しません。
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
その理由は、@aa
の値が現在のレコードの値ではなく、前に受け取ったレコードの
id
値であるためです。
原則として、変数への値の代入と使用の両方の処理を、同じステートメントでは行わないでください。
変数の設定とその使用を同じステートメントで行った場合、変数のデフォルトの結果型がそのステートメントの開始時におけるその変数のデータ型に基づいて決まってしまう、という問題もあります(値が代入されていない変数は
NULL
値を取り、STRING
型であると想定されます)。この例を次に示します。
mysql>SET @a="test";
mysql>SELECT @a,(@a:=20) FROM table_name;
この場合、MySQL では、カラム 1
が文字列としてクライアントに報告されます。そして、2
番目のレコードで @a
が数値に設定されるにもかかわらず、@a
へのすべてのアクセスが文字列に変換されます。ステートメントの実行後、@a
は数値とみなされるようになります。
この場合、何か問題がある場合は、変数の設定とその使用を同じステートメントで行わないようにするか、もしくはその変数を使用する前に値を 0、0.0、または "" に設定するようにします。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.