MySQL supports thread specific variables with the @variablename
syntax. A variable name may consist of alphanumeric characters from the current character set and also `_', `$', and `.' . The default character set is ISO-8859-1 Latin1; this may be changed with the --default-character-set
option to mysqld
. See section 10.1.1 The character set used for data and sorting.
Variables don't have to be initialized. They contain NULL
by default and can store an integer, real or string value. All variables for a thread are automatically freed when the thread exits.
You can set a variable with the SET
syntax:
SET @variable= { integer expression | real expression | string expression } [,@variable= ...].
You can also set a variable in an expression with the @variable:=expr
syntax:
select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
(We had to use the :=
syntax here, because =
was reserved for comparisons.)
User variables may be used where expressions are allowed. Note that this does not currently include use in contexts where a number is explicitly required, such as in the LIMIT
clause of a SELECT
statement, or the IGNORE number LINES
clause of a LOAD DATA
statement.
NOTE: In a SELECT
statement, each expression is only evaluated when it's sent to the client. This means that one can't in the HAVING
, GROUP BY
or ORDER BY
clause refer to an expression that involves variables that are set in the SELECT
part. For example, the following statement will NOT work as expected:
SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
The reason is that @aa
will not contain the value of the current row, but the value of id
for the previous accepted row.