Для конкретного процесса пользователь может определить локальные
переменные, которые в MySQL обозначаются как @variablename
. Имя локальной
переменной может состоять из буквенно-цифровых символов установленного в
данное время алфавита и символов '_
', '$
', and '.
'. Тип кодировки по
умолчанию - ISO-8859-1 Latin1, он может быть изменен указанием иного типа
в аргументе параметра --default-character-set
mysqld
(see Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).
Локальные переменные не требуют инициализации. Они содержат значение NULL
по умолчанию; в них могут храниться целые числа, вещественные числа или
строковые величины. При запуске конкретного процесса все объявленные в нем
локальные переменные автоматически активизируются.
Локальную переменную можно объявить, используя синтаксис команды SET
:
SET @variable= { integer expression | real expression | string expression } [,@variable= ...].
Можно также определить значение переменной иным способом, без команды SET
.
Однако в этом случае в качестве оператора присвоения более предпочтительно
использовать оператор ':=
', чем оператор '=
', так как последний
зарезервирован для сравнения выражений, не связанных с установкой
переменных:
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
Введенные пользователем переменные могут применяться только в составе
выражений и там, где выражения допустимы. Заметим, что в область их
применения в данное время не включается контекст, в котором явно требуется
число, например, условие LIMIT
в команде SELECT
или выражение IGNORE number LINES
в команде LOAD DATA
.
Примечание: в команде SELECT
каждое выражение оценивается только при
отправлении клиенту. Это означает, что в условиях HAVING
, GROUP BY
, or
ORDER BY
не следует ссылаться на выражение, содержащее переменные,
которые введены в части SELECT
этой команды. Например, следующая команда
НЕ будет выполняться так, как ожидалось:
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
Причина в том, что переменная @aa
не будет содержать значения текущей
строки, в то время как значение id
в предыдущем выражении является
строкой.
Действует правило никогда не создавать и не использовать
одну и ту же переменную в одном
и том же выражении SQL.