Comillas en MySQL: simples, dobles y backticks – guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿por qué las comillas en MySQL vuelven loco a todo el mundo?

\n\n

Si alguna vez has escrito consultas SQL en PHP, seguro te has encontrado con la confusión: ¿cuándo usar comillas simples (' '), cuándo dobles (" ") y cuándo esos misteriosos backticks (` `)? Un solo carácter equivocado y, en lugar de obtener datos, te llevas un error de sintaxis en MySQL o, peor aún, un agujero de seguridad.

\n\n

Este tema es una de las preguntas más populares en Stack Overflow (¡más de 2 millones de visitas!). Y no es para menos. Hasta desarrolladores experimentados se confunden a veces. Hoy vamos a aclararlo de una vez por todas. Aprenderás:

\n\n
    \n
  • Qué función cumple cada tipo de comilla en MySQL
  • \n
  • Cómo escapar datos correctamente en PHP
  • \n
  • Por qué las comillas dobles son casi siempre una mala idea
  • \n
  • Cómo protegerte de las inyecciones SQL
  • \n
\n\n

¡Allá vamos! 🚀

\n\n

Anatomía de una consulta MySQL: tres tipos de comillas

\n\n

En MySQL existen tres símbolos que parecen comillas, pero cumplen funciones completamente diferentes:

\n\n

1. Comillas simples (' ') — para valores de texto

\n\n

Cuándo usarlas: siempre que pases una cadena de texto (nombre, fecha, email, contraseña).

\n\n
SELECT * FROM usuarios WHERE nombre = 'Carlos';\nINSERT INTO articulos (titulo) VALUES ('MySQL para principiantes');
\n\n

MySQL interpreta todo lo que está dentro de comillas simples como un literal de cadena. Esto significa que le dices a la base de datos: «Aquí tengo un valor, no intentes interpretarlo como nombre de columna o comando».

\n\n

2. Comillas dobles (" ") — casi lo mismo, pero con un matiz

\n\n

En SQL estándar, las comillas dobles se usan para identificadores (nombres de tablas y columnas). Pero MySQL, por defecto, funciona en un modo donde las comillas dobles equivalen a las simples. Esto suele causar confusión.

\n\n
-- Esto funciona, pero es mejor no hacerlo\nSELECT * FROM usuarios WHERE nombre = \"María\";
\n\n

El problema: si activas el modo estricto ANSI_QUOTES, las comillas dobles empezarán a funcionar como backticks. Tu código se romperá. Por eso:

\n\n

Regla nº1: Usa siempre comillas simples para las cadenas de texto. Las dobles, solo si sabes exactamente lo que haces o por compatibilidad con otros sistemas de bases de datos.

\n\n

3. Backticks (` `) — para nombres de tablas y columnas

\n\n

Los backticks (comillas invertidas) son identificadores. Sirven para:

\n\n
    \n
  • Usar palabras reservadas como nombres (mala práctica, pero a veces ocurre)
  • \n
  • Trabajar con nombres que contienen espacios o caracteres especiales
  • \n
  • Evitar conflictos con palabras clave de MySQL
  • \n
\n\n
-- Mal: 'select' es una palabra reservada\nSELECT * FROM select;\n\n-- Bien: escapamos con backticks\nSELECT * FROM `select`;\n\n-- Obligatorio: nombre con espacio\nSELECT `nombre usuario` FROM usuarios;\n\n-- Recomendado: escapar siempre nombres de tablas y columnas\nSELECT `id`, `nombre` FROM `usuarios` WHERE `estado` = 'activo';
\n\n

Importante: los backticks NO se pueden usar para valores. Esto provocará un error.

\n\n
-- ERROR: MySQL pensará que 'Carlos' es un nombre de columna\nSELECT * FROM usuarios WHERE nombre = `Carlos`;
\n\n

PHP + MySQL: cómo no liarse con las comillas

\n\n

Ahora viene lo interesante: cómo funciona todo esto en PHP. PHP también usa comillas simples y dobles para las cadenas, y es fácil equivocarse.

\n\n

Caso nº1: Insertar variable directamente (¡peligro!)

\n\n
// MAL: vulnerable a inyección SQL\n$nombre = \"Carlos'; DROP TABLE usuarios; --\";\n$consulta = \"SELECT * FROM usuarios WHERE nombre = '$nombre'\";\n// Resultado: SELECT * FROM usuarios WHERE nombre = 'Carlos'; DROP TABLE usuarios; --'
\n\n

Esto es una inyección SQL clásica. ¡Nunca hagas esto!

\n\n

Caso nº2: Escapar con mysqli_real_escape_string (mejor, pero no perfecto)

\n

Blogs

Book Recommendations