MySQL 5.0 soporta variables de usuario, las cuales permiten almacenar un valor y hacer referencia a él más tarde; esto posibilita pasar valores de una sentencia a otra. Las variables de usuario son específicas de la conexión. Esto significa que una variable definida por un cliente no puede ser vista o utilizada por otros clientes. Todas las variables de un cliente son automáticamente liberadas cuando ese cliente abandona la conexión.
Las variables de usuario se escriben como
@
nombre_var
, donde
el nombre de variable nombre_var
puede
consistir de caracteres alfanuméricos tomados del conjunto de
caracteres actual, '.
', '_
',
y '$
'. El conjunto de caracteres predeterminado
es ISO-8859-1 (Latin1). Esto puede cambiarse con la opción de
mysqld
--default-character-set
. Consulte
Sección 5.9.1, “El conjunto de caracteres utilizado para datos y ordenación”. Los nombres de variables de
usuario no son sensibles a mayúsculas en MySQL 5.0.
Una forma de establecer una variable de usuario es empleando una
sentencia SET
:
SET @nombre_var
=expr
[, @nombre_var
=expr
] ...
Con SET
, tanto =
como
:=
pueden usarse como operadores de
asignación. La expr
asignada a cada
variable puede evaluarse a un valor entero, real, cadena, o
NULL
.
Una variable de usuario también puede recibir valores en otras
sentencias que no sean SET
. En este caso, el
operador de asignación debe ser :=
y no
=
porque =
se considera
operador de comparación en otras sentencias que no sean
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 | +----------------------+------+------+------+
Las variables de usuario pueden emplearse en cualquier parte donde
se permitan expresiones. Generalmente esto no incluye situaciones
donde explícitamente se requiere un valor literal, como en la
cláusula LIMIT
de una sentencia
SELECT
, o la cláusula IGNORE número
LINES
de una sentencia LOAD DATA
.
Si se hace referencia a una variable aún sin inicializar, su
valor será NULL
.
En MySQL 5.0, si a una variable se le asigna un valor de cadena, el conjunto de caracteres y la forma de comparación (collation) de la variable serán forzados para ser iguales a los de la cadena. Este comportamiento es implícito desde MySQL 5.0.3 y lo mismo sucede con las columnas de una tabla.
Nota: en una sentencia
SELECT
, cada expresión se evalúa solamente
cuando se envía al cliente. Esto significa que en una cláusula
HAVING
, GROUP BY
, u
ORDER BY
, no es posible hacer referencia a una
expresión que comprenda variables que reciben su valor en la
lista del SELECT
. Por ejemplo, la siguiente
sentencia no funcionará como se espera:
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name
HAVING b=5;
La referencia a b
en la cláusula
HAVING
hace referencia al alias de una
expresión de la lista SELECT
que hace uso de
la variable @aa
. Esto no funciona como se
esperaría: @aa
no contiene el valor de la fila
actual, sino el valor del id
de la fila
anteriormente seleccionada.
La regla general es que nunca se asigne un valor a una variable de usuario en una parte de una sentencia y se use la misma variable en otra parte de la misma sentencia. Se podrían obtener los resultados esperados, pero esto no está garantizado.
Otro problema asociado a asignar el valor de una variable y emplearla en la misma sentencia es que el tipo de dato resultante estará basado en el tipo que tenía la variable al comienzo de la sentencia. El siguiente ejemplo ilustra esto:
mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name
;
En esta sentencia SELECT
, MySQL informa al
cliente que la primer columna es una cadena, y convierte todos los
accesos a @a
en cadenas, aún cuando @a recibe
un valor numérico en la segunda línea. Luego de que la sentencia
SELECT
se ejecuta, @a
se
considera un número para la siguiente sentencia.
Para evitar problemas con este comportamiento, no se debe
inicializar y utilizar la misma variable en la misma sentencia, o,
de lo contrario, hay que establecer su valor en
0
, 0.0
, o
''
para definir su tipo antes de utilizarla.
Una variable sin asignación tiene el valor
NULL
con un tipo cadena.