Поиск

Пользовательские переменные

MySQL поддерживает пользовательские переменные, начиная с версии 3.23.6. Вы можете сохранять значение в пользовательских переменных им обращаться к ним позже, что позволяет передавать значения из одного оператора в другой. Пользовательские пе­ременные связаны с подключением. Это означает, что переменная, определенная одним клиентом, не может быть видима и используема другими. Все переменные клиентского соединения автоматически освобождаются, когда клиент отключается.
Пользовательские переменные записываются как @имя_леремеяяой, где имя перемен­ной имя_переменной может включать алфавитно-цифровые символы текущего набора символов, а также '_' и '$'. Набором символов по умолчанию является ISO-8859-1 (Latinl). Его можно изменить с помощью опции mysqld —-default-character-set. Име­на пользовательских переменных нечувствительны к регистру, начиная с версии MySQL 5.0. В более ранних версиях они зависят от регистра.
Один из способов установки пользовательских переменных предусматривает приме­нение оператор SET:
SET $имя_переменной = выражение [, $имя_переменной - выражение] ...
В операторе SET для присвоения значений можно использовать = или : =. Выражение выражение, присваиваемое каждой переменной, может оцениваться как целое, действи­тельное, строковое или NULL.
Вы также можете присваивать значения пользовательским переменным в операторах, отличных от SET. В этом случае операцией присваивания должна быть только :=, но не =, потому что = трактуется как операция сравнения в операторах, отличных от SET:
mysq; SET @tl=0, @t2=0, @t3=0;
mysq; SELECT @tl:=(@t2:=l)+@t3:=4,@tl,@t2,@t3;
Пользовательские переменные могут быть использованы везде, где допускаются пере­менные. В настоящее время это не включает контексты, явно требующие числа, - такие как конструкция LIMIT оператора SELECT или IGNORE число LINES оператора LOAD DATA.
Если вы обращаетесь к переменной, которая не была инициализирована, ее значение будет равно NULL.
На заметку!
В операторе SELECT каждое выражение вычисляется только при отправке клиенту. Это значит, что в конструкциях HAVING, GROUP BY или ORDER BY нельзя ссылаться на выражение, которое включает переменные, устанавливаемые в списке SELECT. Например, следующий оператор не будет работать, как это ожидается:
mysq; SELECT (@aa:=id) AS a, (@aa+3) AS b FROM имя_таблицы HAVING b=5;
Ссылка на b в конструкции HAVING ссылается на псевдоним выражения в списке SELECT, который использует @аа. Это не работает, как ожидается: @аа не будет содержать значение текущей строки, а будет равно id из предыдущей извлеченной строки.

Основное правило гласит: нельзя одновременно присваивать и использовать пере­менную в одном и том же запросе.
Другое обстоятельство, касающееся установки переменной и использования ее в том же операторе, связано с тем, что тип возврата переменной по умолчанию основывается на типе переменной в начале оператора. Следующий пример иллюстрирует это:
mysq; SET @a='test';
mysq; SELECT @a,(@a:=20) FROM имя_таблицы;
В этом операторе SELECT MySQL сообщит клиенту, что первый столбец строковый, и преобразует все обращения к @а в строки, даже несмотря на то, что ей присваивается число в следующей строке. После того, как SELECT будет выполнен, @а в следующем операторе будет восприниматься как число.
Во избежание проблем, связанных с таким поведением, либо не используйте пере­менную, установленную в том же операторе, или предварительно присваивайте пере­менной значение 0, 0.0 или •', чтобы указать тип при инициализации.
Переменные, которым не присвоено значение, содержат NULL и имеют строковый тип.