6.1.4 Переменные пользователя
Для конкретного процесса пользователь может определить локальные
переменные, которые в MySQL обозначаются как @variablename
. Имя локальной
переменной может состоять из буквенно-цифровых символов установленного в
данное время алфавита и символов `_', `$', and `.'. Тип кодировки по
умолчанию - ISO-8859-1 Latin1, он может быть изменен указанием иного типа
в аргументе параметра --default-character-set
mysqld
(see section 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
в предыдущем выражении является
строкой.
Add your own comment.