9.3. Variables de usuario

MySQL 5.0

9.3. Variables de usuario

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 , donde el nombre de variable 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 . 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 @ =  [, @ = ] ...

Con , tanto como pueden usarse como operadores de asignación. La asignada a cada variable puede evaluarse a un valor entero, real, cadena, o .

Una variable de usuario también puede recibir valores en otras sentencias que no sean . 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 :

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 de una sentencia , o la cláusula de una sentencia .

Si se hace referencia a una variable aún sin inicializar, su valor será .

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 , cada expresión se evalúa solamente cuando se envía al cliente. Esto significa que en una cláusula , , u , no es posible hacer referencia a una expresión que comprenda variables que reciben su valor en la lista del . Por ejemplo, la siguiente sentencia no funcionará como se espera:

mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM  HAVING b=5;

La referencia a en la cláusula hace referencia al alias de una expresión de la lista que hace uso de la variable . Esto no funciona como se esperaría: no contiene el valor de la fila actual, sino el valor del 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 ;

En esta sentencia , MySQL informa al cliente que la primer columna es una cadena, y convierte todos los accesos a en cadenas, aún cuando @a recibe un valor numérico en la segunda línea. Luego de que la sentencia se ejecuta, 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 , , o para definir su tipo antes de utilizarla.

Una variable sin asignación tiene el valor con un tipo cadena.