Variáveis de Usuário
O MariaDB suporta variáveis específicas da conexão com a sintaxe @nomevariável
. Um nome de variável pode consiste de caracteres alfanuméricos do conjunto de caracteres atual e também '_
', '$
' e '.
'. O conjunto de caracteres padrão é ISO-8859-1 Latin1; ele pode ser alterado com a opção --default-character-set
do mysqld
. See "O Conjunto de Caracteres Utilizado para Dados e Ordenação". Os nomes das variáveis de usuários são caso insensitivo nas versão >= 5.0 e caso sensitivo nas versões < 5.0.
As variáveis não precisam ser inicializadas. Elas contém NULL
por padrão e podem armazenar um valor inteiro, real ou uma string. Todas as variáveis de uma thread são automaticamente liberadas quando uma thread termina.
Você pode configurar uma variavel com a syntaxe SET
.
SET @variável= { expressao inteira | expressao real | expressao string } [,@variável= ...].
Você também pode atribuir um valor a uma variável em outras instruções diferentes de SET
. No entanto, neste caso o operador de atribuição é :=
em vez de =
, porque =
é reservado para comparações em instruções diferentes de 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 | +----------------------+------+------+------+
Variáveis de usuários devem ser utilizadas em expressões onde são permitidas. Isto não inclui utiliza-las em contextos onde um número é explicitamente necessário, assim como na cláusula LIMIT
de uma instrução SELECT
ou a clausula IGNORE number LINES
de uma instrução LOAD DATA
.
NOTE: Em uma instrução SELECT
, cada expressão só é avaliada quando enviada ao cliente. Isto significa que nas cláusula HAVING
, GROUP BY
, ou ORDER BY
, você não pode fazer referência a uma expreesão que envolve variáveis que são configuradas na instrução SELECT
. Por examplo, a seguinte instrução NÃO funcionará como o esperado:
SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nome_tabela HAVING b=5;
A razão é que o @aa
não irá conter o valor da linha atual, mas o valor da id
da linha previamente aceita.
A regra geral é nunca atribuir e usar a mesma variável na mesma instrução.
Outra questão com configurar uma variável e usá-la na mesma instrução é que o tipo do resultado padrão de uma variável é baseada no tipo da variável no início da instrução. (Assume-se que uma variável não atribuída possui o valor NULL
e é do tipo STRING). O seguitne exemplo ilustra isto:
mysql>SET @a='test';
mysql>SELECT @a,(@a:=20) FROM table_name;
Neste caso o MariaDB relatará ao cliente que a coluna 1 é uma string e converte todos os acessos de @a
a strings, mesmo que @a seja configurada com um número para a segunda linha. Depois que a instrução é executada @a
será considerado como um número.
Se você tiver qualquer problema com isto, evite tanto configurar e usar a mesma variável na mesma instrução ou configurar a variável com 0, 0.0 ou '' antes de usá-la.