Variables de sistema en MySQL

Mysql tiene muchas variables de sistema que indican cómo está configurado. Cada una tiene un valor por defecto y la mayoría puede ser modificada dinámicamente mientras el servidor está corriendo.

Existen de dos tipos:

  • Globales: afectan la operación del servidor completo
  • de Sesión: afectan la operación de las conexiones cliente individuales

Cuando el servidor inicia, establece todas las variables globales a su valor por defecto. Cuando se inicia una conexión desde un cliente, sus variables de sesión se inicializan usando los valores actuales de las correspondientes variables globales.

Reglas para consultar o establecer el valor de una variable de sistema

  • Variable global: se precede su nombre con GLOBAL o @@global
  • Variable de sesión:
    • se precede su nombre por SESSION, @@session o @@
    • se precede su nombre por LOCAL o @@local
    • no se utiliza ningún modificador (solamente válido para establecer el valor)

Alternativamente se puede utilizar SHOW VARIABLES LIKE ‘variable’, donde se permiten comodines para obtener los valores de varias variables similares.

Ejemplo: Para obtener todas aquellas que definen un charset:

SHOW VARIABLES LIKE 'character_set%'

 

Consultar el valor de una variable de sistema

Si la variable es de sesión:

SELECT @@session.variable;
SELECT @@local.variable;
SELECT @@variable; #Devuelve el valor de la sesión si existe. De lo contrario el global!
SHOW SESSION VARIABLES LIKE 'variable';
SHOW LOCAL VARIABLES LIKE 'variable';
SHOW VARIABLES LIKE 'variable';

Si la variable es global:

SELECT @@GLOBAL.variable;
SHOW GLOBAL VARIABLES LIKE 'variable';

Establecer el valor de una variable de sistema

Si la variable es de sesión:

SET @@session.variable = 'valor';
SET @@local.variable = 'valor';
SET @@variable = 'valor';
SET SESSION variable = 'valor';
SET LOCAL variable = 'valor';
SET variable = 'valor';

El valor se mantiene durante esa sesión (o hasta que se cambie) y no es visible para otros clientes.

Si la variable es global:

SET @@global.variable = 'valor';
SET GLOBAL variable = 'valor';

Se requiere tener el privilegio SUPER para poder cambiar valores de variables globales.

El nuevo valor aplica solamente clientes que se conecten luego del cambio (no afecta las variables de sesión de ningún cliente previamente conectado)

Anuncios

Uso de comodines en sentencia con LIKE en MySQL

Al realizar una consulta sql utilizando LIKE, existen 2 comodines:

  • % Coincidencia de cualquier número de caracteres, incluso cero caracteres
  • _ Coincidencia exacta de un carácter

Para ejemplificar su uso, consideremos una tabla de usuarios donde tenemos 6 registros cuyos valores para el campo login son: ‘admin’, ‘admin1’, ‘admin2’, ‘admin_3’, ‘admin_4’ y ‘administrador’.

 

El primero de ellos (%), es el más conocido. Si ejecutamos:

mysql> SELECT * FROM usuarios WHERE login LIKE "admin%"

obtenemos los registros cuyo login comience con ‘admin’ y continúe con 0 o más caracteres. En nuestro caso: ‘admin’, ‘admin1’, ‘admin2’, ‘admin_3’, ‘admin_4’ y ‘administrador’ (todos los registros).

 

El segundo (_), funciona de manera similar y si ejecutamos:

mysql> SELECT * FROM usuarios WHERE login LIKE "admin_"

obtenemos los registros cuyo login comience con ‘admin’ y tenga un único carácter a continuación. En nuestro caso: ‘admin1’ y ‘admin2’ (requiere que exista un único carácter luego del texto ‘admin’).

 

Hasta aquí todo está claro, pero ¿qué sucede si quisiéramos obtener los registros cuyo login comience con ‘admin_’ (tienen un guión bajo luego del texto ‘admin’)?

Si planteamos la consulta así:

mysql> SELECT * FROM usuarios WHERE login LIKE "admin_%"

obtenemos los registros cuyo login comience con ‘admin’, tenga un carácter a continuación y luego 0 o más caracteres. En nuestro caso: ‘admin1’, ‘admin2’, ‘admin_3’, ‘admin_4’ y ‘administrador’.

 

Para poder utilizar los comodines dentro de un LIKE como si fueran simples caracteres (instancias literales), es necesario anteponerles el carácter de escape \:

mysql> SELECT * FROM usuarios WHERE login LIKE "admin_%"

así obtenemos los registros cuyo login comience con ‘admin’, tenga un guión bajo a continuación y luego 0 o más caracteres. En nuestro caso: ‘admin_3’ y ‘admin_4’.

Se puede definir otro carácter de escape en una consulta de la siguiente manera:

mysql> SELECT * FROM usuarios WHERE login LIKE "admin|_%" ESCAPE '|';