¿Qué UTF usar en MySQL?

Cómo Usar $$ como Delimitador en MySQL

Valoración: 4.36 (6893 votos)

En el mundo de las bases de datos, y particularmente en MySQL, los delimitadores juegan un papel crucial, aunque a menudo pasan desapercibidos para quienes recién empiezan. Un delimitador es, esencialmente, un carácter o una secuencia de caracteres que le indica al cliente de MySQL (como la línea de comandos o MySQL Workbench) dónde termina una instrucción SQL y dónde comienza la siguiente. Por defecto, el delimitador estándar en MySQL es el punto y coma (;).

Este delimitador predeterminado funciona perfectamente para la mayoría de las operaciones diarias, como ejecutar sentencias SELECT, INSERT, UPDATE o DELETE. Puedes escribir varias sentencias en una sola línea o en múltiples líneas, y el cliente las ejecutará una por una, interpretando cada punto y coma como el fin de una instrucción individual.

¿Qué es el símbolo tilde en MySQL?
Una tilde inicial actúa como operador de negación, lo que hace que la contribución de la palabra a la relevancia de la fila sea negativa . Esto es útil para marcar palabras "ruido". Una fila que contiene una palabra así tiene una puntuación inferior a las demás, pero no se excluye por completo, como ocurriría con el operador -.

Sin embargo, surge un desafío importante cuando trabajamos con estructuras más complejas que, por naturaleza, contienen múltiples sentencias internas que también terminan en punto y coma. El ejemplo más común y relevante de esto son los procedimientos almacenados y los triggers (disparadores).

Índice de Contenido

El Problema con el Punto y Coma en Procedimientos Almacenados

Imagina que estás definiendo un procedimiento almacenado que realiza varias operaciones. Dentro del cuerpo de este procedimiento, tendrás sentencias SQL como SELECT * FROM tabla;, UPDATE otra_tabla SET columna = valor WHERE condicion;, etc. Cada una de estas sentencias termina con un punto y coma, como es habitual en SQL.

Si intentas enviar la definición completa de este procedimiento almacenado al cliente de MySQL usando el delimitador por defecto (el punto y coma), el cliente interpretará cada punto y coma *dentro* del cuerpo del procedimiento como el final de una instrucción separada. En lugar de ver toda la definición del procedimiento como una única unidad para ser compilada y almacenada, verá múltiples instrucciones cortas, lo que resultará en errores de sintaxis o en la ejecución parcial e incorrecta de tu script.

Por ejemplo, si intentaras definir un procedimiento simple así:

CREATE PROCEDURE mi_procedimiento()
BEGIN
SELECT 'Hola Mundo';
END;

El cliente de MySQL, al encontrar el primer punto y coma después de 'Hola Mundo', podría pensar que la instrucción SELECT 'Hola Mundo' es la instrucción completa a ejecutar, antes de que la definición del procedimiento haya terminado. Esto rompe el flujo y la lógica esperada.

La Solución: Cambiar Temporalmente el Delimitador

Para resolver este problema, necesitamos indicarle al cliente de MySQL que ignore los puntos y coma dentro de la definición de nuestro procedimiento almacenado o trigger y que solo considere que la definición completa ha terminado cuando encuentre un delimitador diferente. Una vez que la definición ha sido procesada, podemos volver a cambiar el delimitador a su valor por defecto (el punto y coma).

El comando para cambiar el delimitador es DELIMITER, seguido del nuevo carácter o secuencia de caracteres que deseas usar como delimitador. Los delimitadores más comunes elegidos para este propósito son $$ y //, aunque técnicamente podrías usar casi cualquier secuencia de caracteres que no aparezca dentro del código que estás definiendo.

La sintaxis es sencilla:

DELIMITER nuevo_delimitador

Por ejemplo, para cambiar el delimitador a $$:

DELIMITER $$

Y para cambiarlo de vuelta al punto y coma:

DELIMITER ;

Cómo Usar $$ para Definir un Procedimiento Almacenado

El uso típico de un delimitador personalizado como $$ al crear un procedimiento almacenado sigue este patrón:

  1. Cambia el delimitador predeterminado (;) a uno nuevo (por ejemplo, $$).
  2. Escribe la sentencia CREATE PROCEDURE (o CREATE TRIGGER), incluyendo todo su cuerpo, utilizando puntos y coma internos donde sea necesario.
  3. Finaliza la sentencia CREATE PROCEDURE completa con el nuevo delimitador (en este caso, $$).
  4. Vuelve a cambiar el delimitador a su valor por defecto (;).

Aquí tienes un ejemplo práctico utilizando $$:

DELIMITER $$

CREATE PROCEDURE obtener_clientes()
BEGIN
SELECT id, nombre FROM clientes WHERE activo = 1 ORDER BY nombre;
SELECT COUNT(*) FROM clientes WHERE activo = 1;
END$$

DELIMITER ;

En este ejemplo:

  • DELIMITER $$: Le dice al cliente de MySQL que, a partir de ahora, el final de una instrucción se marcará con $$.
  • CREATE PROCEDURE ... END$$: La definición completa del procedimiento, incluyendo las dos sentencias SELECT internas (que terminan en ;), es tratada como una única instrucción por el cliente. El cliente solo sabe que la definición ha terminado cuando encuentra END$$.
  • DELIMITER ;: Restablece el delimitador al punto y coma por defecto, lo cual es crucial para que las sentencias SQL posteriores (como ejecutar el procedimiento con CALL obtener_clientes();) funcionen correctamente.

Si no restablecieras el delimitador al final, tendrías que usar $$ para terminar todas tus sentencias SQL posteriores, lo cual no es lo habitual y puede causar confusión.

Alternativas Comunes: Usando // como Delimitador

El delimitador // es otra opción muy popular y funciona exactamente de la misma manera que $$. La elección entre $$ y // es puramente una cuestión de preferencia personal o convención dentro de un equipo o proyecto.

El ejemplo anterior, usando //, se vería así:

DELIMITER //

CREATE PROCEDURE obtener_clientes()
BEGIN
SELECT id, nombre FROM clientes WHERE activo = 1 ORDER BY nombre;
SELECT COUNT(*) FROM clientes WHERE activo = 1;
END//

DELIMITER ;

Como puedes ver, la lógica es idéntica. Lo importante es que el carácter o secuencia de caracteres que uses después de DELIMITER al principio sea el mismo que usas para finalizar la definición del procedimiento o trigger.

Consideraciones Importantes

  • Consistencia: Asegúrate de que el delimitador que defines con el comando DELIMITER coincida exactamente con el delimitador que usas para finalizar la definición de tu objeto (procedimiento o trigger).
  • Restablecimiento: Siempre, siempre, siempre restablece el delimitador al punto y coma (DELIMITER ;) después de haber definido tus procedimientos o triggers. Olvidar este paso puede causar problemas inesperados al ejecutar scripts posteriores.
  • Elección del Delimitador: Aunque puedes usar casi cualquier secuencia, $$ y // son convenciones bien establecidas y reconocibles, lo que mejora la legibilidad de tu código. Evita usar caracteres que puedan aparecer legítimamente dentro de tu código SQL (como letras, números, guiones bajos, etc.).
  • Entornos Gráficos: Herramientas como MySQL Workbench a menudo manejan automáticamente el cambio de delimitador cuando defines procedimientos o triggers a través de su interfaz gráfica o editores de código. Sin embargo, entender cómo funciona el comando DELIMITER es esencial cuando trabajas con scripts SQL directamente, ya sea desde la línea de comandos o ejecutando archivos SQL.

Tabla Comparativa: Delimitador por Defecto vs. Personalizado

CaracterísticaDelimitador por Defecto (;)Delimitador Personalizado ($$ o //)
Uso PrincipalSeparar sentencias SQL individualesPermitir que objetos con ; internos (procedimientos, triggers) sean tratados como una sola sentencia
Cuándo se UsaLa mayor parte del tiempo, para sentencias básicas (SELECT, INSERT, etc.)Temporalmente, solo al definir procedimientos almacenados, triggers, eventos, etc.
Cómo se DefineEs el valor predeterminado, no necesita ser declarado explícitamente (a menos que se haya cambiado antes)Se define explícitamente con el comando DELIMITER
Ejemplo de UsoSELECT * FROM tabla;
INSERT INTO tabla ...;
DELIMITER $$
CREATE PROCEDURE ... END$$
DELIMITER ;
Necesita RestablecerseNo (es el valor por defecto)Sí, siempre debe restablecerse a ; después de su uso temporal

Preguntas Frecuentes sobre Delimitadores

¿Por qué mis scripts de procedimientos almacenados dan error cuando los ejecuto desde un archivo .sql?

Probablemente porque el cliente de MySQL está interpretando los puntos y coma dentro del cuerpo de tus procedimientos como finales de sentencia. Debes incluir el comando DELIMITER $$ (o el que elijas) antes de la definición del procedimiento y DELIMITER ; después.

¿Puedo usar cualquier carácter como delimitador?

Puedes usar una o más secuencias de caracteres, siempre y cuando no aparezcan dentro del código del procedimiento o trigger que estás definiendo. $$ y // son populares porque son poco comunes en el código SQL normal.

¿Es necesario restablecer el delimitador a punto y coma?

Sí, es fundamental. Si no lo haces, todas las sentencias SQL que ejecutes después intentarán terminar con el nuevo delimitador (por ejemplo, $$), lo cual hará que la mayoría de las sentencias estándar fallen.

¿El comando DELIMITER es parte del estándar SQL?

No, DELIMITER es un comando específico del cliente de MySQL (como el cliente de línea de comandos o Workbench) y no es una parte estándar del lenguaje SQL. Le indica al cliente cómo analizar el script antes de enviarlo al servidor.

Conclusión

Dominar el uso del comando DELIMITER es una habilidad esencial para cualquier desarrollador o administrador de bases de datos que trabaje con MySQL, especialmente al crear procedimientos almacenados, triggers o eventos. Comprender por qué el semicolon por defecto puede ser problemático en estos casos y cómo cambiarlo temporalmente a un delimitador como $$ o //, para luego restablecerlo, te permitirá escribir y ejecutar tus scripts de manera correcta y eficiente, evitando errores comunes y asegurando que tus objetos de base de datos se definan tal como esperas.

Si quieres conocer otros artículos parecidos a Cómo Usar $$ como Delimitador en MySQL puedes visitar la categoría MySQL.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir