DATABASE()

Cuando trabajas con múltiples bases de datos en un mismo servidor MySQL, es habitual perder la noción de cuál es la base de datos activa en tu sesión. La función DATABASE() resuelve esta incertidumbre de forma inmediata: devuelve el nombre de la base de datos que seleccionaste con USE o al conectarte. Es una herramienta imprescindible en scripts, procedimientos almacenados y cualquier situación donde el contexto de la base de datos determine el comportamiento de tus consultas.

MySQL también ofrece SCHEMA() como sinónimo exacto de DATABASE(). Ambas funciones devuelven el mismo resultado sin ninguna diferencia de rendimiento ni de comportamiento. La existencia de SCHEMA() responde a la compatibilidad con el estándar SQL, donde el término schema es más habitual que database.

Sintaxis de DATABASE() y SCHEMA()

La sintaxis de estas funciones es tan simple como invocarlas sin argumentos. No reciben ningún parámetro y devuelven una cadena de texto con el nombre de la base de datos activa.

SELECT DATABASE();
SELECT SCHEMA();

Ambas llamadas producen exactamente el mismo resultado. Si previamente ejecutaste USE tienda_online, el resultado será tienda_online. Si no has seleccionado ninguna base de datos desde que abriste la conexión, el resultado será NULL.

-- Conectarse sin seleccionar base de datos
SELECT DATABASE();
-- Resultado: NULL
 
USE tienda_online;
SELECT DATABASE();
-- Resultado: tienda_online

El valor devuelto es de tipo VARCHAR y contiene el nombre tal como fue creado, respetando las mayúsculas y minúsculas del sistema de archivos del servidor (en Linux los nombres son sensibles a mayúsculas; en Windows, no).

Detectar si hay una base de datos seleccionada

Uno de los usos más prácticos de DATABASE() es verificar que existe un contexto de base de datos activo antes de ejecutar operaciones que lo requieran. Cuando un script se conecta al servidor sin especificar una base de datos en la cadena de conexión, cualquier consulta que haga referencia a tablas sin calificar fallará con un error. Puedes anticiparte a esta situación comprobando el valor de DATABASE().

-- Verificar si hay base de datos activa
SELECT
  CASE
    WHEN DATABASE() IS NULL THEN 'No hay base de datos seleccionada'
    ELSE CONCAT('Base de datos activa: ', DATABASE())
  END AS estado;

Este patrón es especialmente útil en entornos donde la conexión a MySQL se establece de forma genérica y la selección de la base de datos depende de un paso posterior. Si el resultado es NULL, sabes que necesitas ejecutar un USE antes de continuar.

-- Ejemplo de flujo seguro en un script
SELECT DATABASE() INTO @bd_actual;
 
-- Si no hay base de datos, seleccionar una
-- (En un procedimiento almacenado podrías usar lógica condicional)

Uso en procedimientos almacenados

Dentro de procedimientos almacenados, DATABASE() permite crear lógica dinámica que se adapta al contexto de ejecución. Un procedimiento puede verificar en qué base de datos está operando y ajustar su comportamiento en consecuencia. Esto resulta particularmente valioso cuando el mismo procedimiento se despliega en múltiples bases de datos con propósitos distintos, como un entorno de desarrollo frente a uno de producción.

DELIMITER //
 
CREATE PROCEDURE verificar_entorno()
BEGIN
  DECLARE bd_actual VARCHAR(64);
  SET bd_actual = DATABASE();
 
  IF bd_actual IS NULL THEN
    SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'Error: no hay base de datos seleccionada';
  ELSEIF bd_actual LIKE '%_dev' THEN
    SELECT 'Entorno de DESARROLLO detectado' AS mensaje;
  ELSEIF bd_actual LIKE '%_prod' THEN
    SELECT 'Entorno de PRODUCCIÓN detectado' AS mensaje;
  ELSE
    SELECT CONCAT('Base de datos activa: ', bd_actual) AS mensaje;
  END IF;
END //
 
DELIMITER ;

En este ejemplo, el procedimiento identifica si la base de datos activa corresponde a desarrollo o producción basándose en una convención de nomenclatura con sufijos _dev y _prod. Si no hay ninguna base de datos seleccionada, lanza un error controlado con SIGNAL.

Condicionar comportamiento según la base de datos

Existen escenarios donde quieres que un mismo bloque de código SQL se comporte de manera diferente dependiendo de la base de datos activa. Por ejemplo, en un entorno de pruebas podrías querer insertar datos de ejemplo, mientras que en producción solo consultas datos reales.

DELIMITER //
 
CREATE PROCEDURE insertar_cliente_prueba()
BEGIN
  IF DATABASE() LIKE '%_test' OR DATABASE() LIKE '%_dev' THEN
    INSERT INTO clientes (nombre, email, ciudad)
    VALUES ('Cliente de Prueba', 'test@ejemplo.com', 'Madrid');
    SELECT 'Cliente de prueba insertado correctamente' AS resultado;
  ELSE
    SELECT 'Operación bloqueada: solo disponible en entornos de prueba' AS resultado;
  END IF;
END //
 
DELIMITER ;

Este procedimiento actúa como una salvaguarda: solo permite la inserción de datos ficticios cuando la base de datos activa tiene un nombre que indica claramente que es un entorno de pruebas. En cualquier otro caso, la operación se rechaza con un mensaje descriptivo.

Combinar DATABASE() con USE

La función DATABASE() es el complemento natural del comando USE. Mientras que USE cambia la base de datos activa, DATABASE() te permite confirmar que el cambio se realizó correctamente. Este patrón es habitual en scripts que operan sobre varias bases de datos en secuencia.

USE tienda_online;
SELECT DATABASE() AS bd_actual;
-- Resultado: tienda_online
 
-- Realizar operaciones en tienda_online
SELECT COUNT(*) AS total_clientes FROM clientes;
 
USE inventario;
SELECT DATABASE() AS bd_actual;
-- Resultado: inventario
 
-- Realizar operaciones en inventario
SELECT COUNT(*) AS total_productos FROM productos;

Es importante recordar que USE solo afecta a la sesión actual. Si tienes dos terminales abiertas conectadas al mismo servidor, cada una mantiene su propia base de datos activa de forma independiente. La función DATABASE() siempre refleja el estado de la sesión desde la que se invoca.

Uso en consultas de auditoría y registro

Cuando necesitas registrar en qué base de datos se ejecutó una operación, DATABASE() proporciona esa información de forma automática. Esto es útil en tablas de auditoría centralizadas que reciben registros desde múltiples bases de datos.

-- Tabla de auditoría en una base de datos central
CREATE TABLE auditoria_central.registro_operaciones (
  id INT AUTO_INCREMENT PRIMARY KEY,
  base_datos VARCHAR(64) NOT NULL,
  operacion VARCHAR(255) NOT NULL,
  usuario VARCHAR(100) NOT NULL,
  fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
 
-- Registrar una operación desde cualquier base de datos
INSERT INTO auditoria_central.registro_operaciones
  (base_datos, operacion, usuario)
VALUES
  (DATABASE(), 'Actualización masiva de precios', USER());

De este modo, cada registro de auditoría incluye automáticamente el nombre de la base de datos donde se originó la acción, sin necesidad de codificarlo manualmente.

Consultar las bases de datos disponibles

Además de saber cuál es la base de datos activa, es habitual necesitar una lista de todas las bases de datos disponibles en el servidor. Para ello puedes usar SHOW DATABASES, que complementa perfectamente a DATABASE().

-- Ver todas las bases de datos del servidor
SHOW DATABASES;
 
-- Comparar con la base de datos activa
SELECT
  DATABASE() AS base_activa,
  (SELECT COUNT(*) FROM information_schema.SCHEMATA) AS total_bases;

Esta combinación te da una visión completa: sabes dónde estás y qué otras opciones tienes disponibles.

Errores comunes

El error más frecuente con DATABASE() es asumir que siempre devuelve un valor. Si abres una conexión al servidor MySQL sin especificar una base de datos y ejecutas una consulta como SELECT * FROM clientes, obtendrás un error ERROR 1046 (3D000): No database selected. Antes de culpar a la tabla o a los permisos, verifica con SELECT DATABASE() que tienes un contexto activo.

Otro error habitual es confundir DATABASE() con funciones que aceptan parámetros. Si escribes DATABASE('tienda_online') esperando que seleccione esa base de datos, no obtendrás el resultado deseado. DATABASE() es solo de lectura: informa, pero no modifica el estado de la sesión. Para cambiar de base de datos, necesitas el comando USE.

Un tercer punto de confusión surge al trabajar con nombres cualificados. Si ejecutas SELECT * FROM otra_bd.clientes, la base de datos activa no cambia. DATABASE() seguirá devolviendo la base de datos que seleccionaste con USE, independientemente de que tus consultas referencien tablas de otras bases de datos.

Cuándo usar DATABASE()

Utiliza DATABASE() siempre que necesites confirmar o registrar el contexto de base de datos en tu sesión. Los escenarios más habituales incluyen la validación de entorno al inicio de scripts de migración, el registro de auditoría que necesita identificar la base de datos de origen, los procedimientos almacenados que adaptan su comportamiento según el entorno, y la depuración cuando una consulta falla porque no hay base de datos seleccionada. Es una función ligera, sin impacto en el rendimiento, que puedes invocar tantas veces como necesites sin preocuparte por la eficiencia.

Escrito por Eduardo Lázaro