Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Quando usar aspas simples, aspas duplas e acentos graves no MySQL


Backticks devem ser usados ​​para identificadores de tabela e coluna, mas são necessários apenas quando o identificador é um 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) Geralmente, é recomendável evitar o uso de palavras-chave reservadas como identificadores de coluna ou tabela quando possível, evitando o problema de aspas.

Aspas simples devem ser usadas para valores de string como em VALUES() Lista. Aspas duplas também são suportadas pelo MySQL para valores de string, mas aspas simples são mais amplamente aceitas por outros RDBMS, então é um bom hábito usar aspas simples em vez de duplas.

MySQL também espera DATE e DATETIME valores literais a serem entre aspas simples como strings como '2001-01-01 00:00:00' . Consulte os literais de data e hora documentação para mais detalhes, em particular alternativas ao uso do hífen - como delimitador de segmento em strings de data.

Então, usando seu exemplo, eu colocaria aspas duplas na string PHP e usaria aspas simples nos valores 'val1', 'val2' . NULL é uma palavra-chave do MySQL e um valor especial (não) e, portanto, não está entre aspas.

Nenhum desses identificadores de tabela ou coluna são palavras reservadas ou fazem uso de caracteres que exigem aspas, mas eu os citei de qualquer maneira com acentos graves (mais sobre isso depois...).

Funções nativas do RDBMS (por exemplo, NOW() no MySQL) não devem ser citados, embora seus argumentos estejam sujeitos às mesmas regras de citação de string ou identificador já mencionadas.
Backtick (`)
table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐
                      ↓     ↓  ↓  ↓  ↓    ↓  ↓    ↓  ↓    ↓  ↓       ↓
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) 
                       VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())";
                               ↑↑↑↑  ↑    ↑  ↑    ↑  ↑          ↑  ↑↑↑↑↑ 
Unquoted keyword          ─────┴┴┴┘  │    │  │    │  │          │  │││││
Single-quoted (') strings ───────────┴────┴──┴────┘  │          │  │││││
Single-quoted (') DATE    ───────────────────────────┴──────────┘  │││││
Unquoted function         ─────────────────────────────────────────┴┴┴┴┘    

Interpolação de 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 estar entre aspas duplas no PHP. Apenas certifique-se de ter escapado corretamente das variáveis ​​para uso no SQL. (Recomenda-se usar uma API que suporte declarações preparadas em vez disso, como proteção contra injeção de SQL ).
// Same thing with some variable replacements
// Here, a variable table name $table is backtick-quoted, and variables
// in the VALUES list are single-quoted 
$query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";

Declarações preparadas


Ao trabalhar com declarações preparadas, consulte a documentação para determinar se os marcadores de posição da declaração devem ou não ser citados. As APIs mais populares disponíveis em PHP, PDO e MySQLi, exceto sem aspas placeholders, assim como as APIs de instruçã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 citando em 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 0-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 então você deve citá-los (backtick).

Além disso, embora os números sejam caracteres válidos para identificadores, os identificadores não podem consistir apenas em números. Se o fizerem, devem ser embrulhados em backticks.