Introducción: ¿por qué las comillas en MySQL vuelven loco a todo el mundo?
\n\nSi 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.
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
¡Allá vamos! 🚀
\n\nAnatomía de una consulta MySQL: tres tipos de comillas
\n\nEn MySQL existen tres símbolos que parecen comillas, pero cumplen funciones completamente diferentes:
\n\n1. Comillas simples (' ') — para valores de texto
\n\nCuándo usarlas: siempre que pases una cadena de texto (nombre, fecha, email, contraseña).
\n\nSELECT * FROM usuarios WHERE nombre = 'Carlos';\nINSERT INTO articulos (titulo) VALUES ('MySQL para principiantes');\n\nMySQL 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\n2. Comillas dobles (" ") — casi lo mismo, pero con un matiz
\n\nEn 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\nEl problema: si activas el modo estricto ANSI_QUOTES, las comillas dobles empezarán a funcionar como backticks. Tu código se romperá. Por eso:
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\n3. Backticks (` `) — para nombres de tablas y columnas
\n\nLos 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
-- 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\nImportante: 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\nPHP + MySQL: cómo no liarse con las comillas
\n\nAhora 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\nCaso 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\nEsto es una inyección SQL clásica. ¡Nunca hagas esto!
\n\n