Introdução: por que as aspas no MySQL são tão confusas?
\n\nSe você já escreveu consultas SQL em PHP, com certeza já se perguntou: quando usar aspas simples (' '), quando usar aspas duplas (" ") e quando usar aqueles misteriosos backticks (` `)? Um único caractere errado e, em vez dos dados esperados, você recebe um erro de sintaxe no MySQL ou, pior ainda, uma brecha de segurança.
Este é um dos tópicos mais populares no Stack Overflow (mais de 2 milhões de visualizações!). E não é à toa. Até desenvolvedores experientes às vezes se confundem. Hoje, vamos esclarecer tudo de uma vez por todas. Você vai aprender:
\n\n- \n
- A função de cada tipo de aspas no MySQL \n
- Como escapar dados corretamente em PHP \n
- Por que as aspas duplas são quase sempre uma má ideia \n
- Como se proteger contra SQL injection \n
Vamos nessa! 🚀
\n\nAnatomia de uma consulta MySQL: três tipos de aspas
\n\nNo MySQL, existem três símbolos diferentes que se parecem com aspas, mas têm funções completamente distintas:
\n\n1. Aspas simples (' ') — para valores de string
\n\nQuando usar: sempre que você estiver passando uma string (texto, data, email, senha).
\n\nSELECT * FROM usuarios WHERE nome = 'João';\nINSERT INTO artigos (titulo) VALUES ('MySQL para iniciantes');\n\nO MySQL interpreta tudo que está dentro de aspas simples como um literal de string. Isso significa que você está dizendo ao banco: "Aqui tenho um valor, não tente interpretar isso como nome de coluna ou comando".
\n\n2. Aspas duplas (" ") — quase a mesma coisa, mas com uma diferença
\n\nNo SQL padrão, aspas duplas são usadas para identificadores (nomes de tabelas e colunas). Mas o MySQL, por padrão, opera em um modo onde as aspas duplas são equivalentes às aspas simples. Isso geralmente causa confusão.
\n\n-- Isso funciona, mas é melhor evitar\nSELECT * FROM usuarios WHERE nome = "Maria";\n\nProblema: se você ativar o modo estrito ANSI_QUOTES, as aspas duplas passarão a funcionar como backticks. Seu código vai quebrar. Portanto:
Regra nº 1: Use aspas simples para strings. Sempre. Aspas duplas só se você souber exatamente o que está fazendo ou para compatibilidade com outros SGBDs.
\n\n3. Backticks (` `) — para nomes de tabelas e colunas
\n\nBackticks (crases) são identificadores. Eles são necessários para:
\n\n- \n
- Usar palavras reservadas como nomes (má prática, mas acontece) \n
- Trabalhar com nomes que contêm espaços ou caracteres especiais \n
- Evitar conflitos com palavras-chave do MySQL \n
-- Ruim: 'select' é uma palavra reservada\nSELECT * FROM select;\n\n-- Bom: escapando com backticks\nSELECT * FROM `select`;\n\n-- Obrigatório: nome com espaço\nSELECT `nome usuario` FROM usuarios;\n\n-- Recomendado: sempre escapar nomes de tabelas e colunas\nSELECT `id`, `nome` FROM `usuarios` WHERE `status` = 'ativo';\n\nImportante: backticks NÃO podem ser usados para valores. Isso causará um erro.
\n\n-- ERRO: o MySQL vai achar que 'João' é um nome de coluna\nSELECT * FROM usuarios WHERE nome = `João`;\n\nPHP + MySQL: como não se confundir com as aspas
\n\nAgora a parte mais interessante — como tudo isso funciona no PHP. O PHP também usa aspas simples e duplas para strings, e é fácil cometer erros.
\n\nCaso nº 1: Inserção direta de variável (perigoso!)
\n\n// RUIM: vulnerável a SQL injection\n$nome = "João'; DROP TABLE usuarios; --";\n$query = "SELECT * FROM usuarios WHERE nome = '$nome'";\n// Resultado: SELECT * FROM usuarios WHERE nome = 'João'; DROP TABLE usuarios; --'\n\nEste é o clássico SQL injection. Nunca faça isso!
\n\n