Os backticks devem ser usados para identificadores de tabela e coluna, mas são necessários apenas quando o identificador é uma palavra-chave reservada do MySQL , ou quando o identificador contém caracteres de espaço em branco ou caracteres além de um conjunto limitado (veja abaixo). É recomendável evitar o uso de palavras-chave reservadas como identificadores de coluna ou tabela, quando possível, evitando o problema de citação.
Aspas simples devem ser usadas para valores de sequência, como na VALUES()
lista. As aspas duplas também são suportadas pelo MySQL para valores de string, mas as aspas simples são mais amplamente aceitas por outros RDBMS, portanto, é um bom hábito usar aspas simples em vez de duplo.
MySQL também espera DATE
e DATETIME
valores literais para ser single-citado como strings como '2001-01-01 00:00:00'
. Consulte a documentação Literais de data e hora para obter mais detalhes, em particular alternativas ao uso do hífen -
como delimitador de segmento nas cadeias de datas.
Então, usando o seu exemplo, aspas duplas na string PHP e uso aspas simples nos valores 'val1', 'val2'
. NULL
é uma palavra-chave do MySQL e um valor especial (não) e, portanto, não é citado.
Nenhum desses identificadores de tabela ou coluna são palavras reservadas ou utiliza caracteres que requerem citação, mas as citei de qualquer maneira com backticks (mais sobre isso mais adiante ...).
As funções nativas do RDBMS (por exemplo, NOW()
no MySQL) não devem ser citadas, embora seus argumentos estejam sujeitos às mesmas regras de citação de string ou identificador já mencionadas.
Backtick (`)
tabela e coluna ───────┬──────────┬──┬────┬─────────────────────────────┬──┬ ───────┐
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = " INSERT INTO` tabela` (`id`,` col1`, `col2`,` data`, `atualizada`)
VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑
Palavra-chave não citada ─────┴┴┴┘ │ │ │ │ │ │ │││││
Sequências de aspas simples (') ───────────────┴──┴────┘ │ │ │││││
Aspas simples (') DATA ───────────────────────────────────────────┘ ││││ │
Função não citada ───────────────────────────────────────
Interpolação variável
Os padrões de citação para variáveis não mudam, embora se você pretender interpolar as variáveis diretamente em uma string, ela deve ser citada duas vezes no PHP. Apenas certifique-se de que você escapou corretamente das variáveis para uso no SQL. ( É recomendável usar uma API que suporte instruções preparadas, como proteção contra injeção de SQL ).
// O mesmo ocorre com algumas substituições de variáveis
// Aqui, um nome de tabela variável $ table é citado por backtick e variáveis
// na lista VALUES são aspas simples
$ query = "INSERIR EM` $ tabela` (`id`,` col1`, `col2`,` data`) VALORES (NULL, '$ val1' , '$ val2' , '$ date' ) ";
Declarações preparadas
Ao trabalhar com instruções preparadas, consulte a documentação para determinar se os espaços reservados da declaração devem ou não ser citados. As APIs mais populares disponíveis no PHP, PDO e MySQLi esperam espaços reservados não citados, assim como as APIs de declaração mais preparadas em outros idiomas:
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
Caracteres que requerem backtick entre aspas nos identificadores:
De acordo com a documentação do MySQL , você não precisa citar identificadores (backtick) usando o seguinte conjunto de caracteres:
ASCII: [0-9,a-z,A-Z$_]
(letras latinas básicas, dígitos de 0 a 9, dólar, sublinhado)
Você pode usar caracteres além desse conjunto como identificadores de tabela ou coluna, incluindo espaços em branco, por exemplo, mas depois deve citá-los (backtick).
"tablename"
, e aspas simples são para literais, por exemplo'this is a some text'
. Os back-ticks nunca são usados no SQL padrão. (Se você precisa incluir aspas duplas em um identificador, digite-o duas vezes"odd""tablename"
Da mesma forma, plicas duplas em literais, como.'Conan O''Brien'
.)