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 nombre_varnombre_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.
    
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

