Quando usar aspas simples, aspas duplas e as carrapatos no MySQL

Estou tentando aprender a melhor maneira de escrever consultas. Também entendo a importância de ser consistente. Até agora, usei aleatoriamente citações simples, citações duplas e carrapatos traseiros sem qualquer pensamento real.

Exemplo:

$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)'; 

Além disso, no exemplo acima, considere que "table," "col[n]," and "val[n]" podem ser variables.

Qual é o padrão para isso? O que você faz?

Estive lendo respostas para perguntas semelhantes aqui por cerca de 20 minutos, mas parece que não há uma resposta definitiva a esta questão.

Os backticks devem ser usados ​​para identificadores de tabela e coluna, mas só são necessários quando o identificador é uma palavra-chave reservada do MySQL ou quando o identificador contém caracteres ou caracteres de espaço em branco além de um conjunto limitado (veja abaixo). Muitas vezes, é recomendado evitar o uso de palavras-chave reservadas como identificadores de coluna ou tabela, quando possível, evitando o problema de cotação.

Aspas simples devem ser usadas para valores de string como na lista VALUES() . As cotações duplas também são suportadas pelo MySQL para valores de cadeia, mas as citações simples são mais amplamente aceitas por outros RDBMS, por isso é um bom hábito usar citações simples em vez de duplicar.

O MySQL também espera que os valores literais DATE e DATETIME sejam single-coted como strings como '2001-01-01 00:00:00' . Consulte a documentação de Data e Hora Literais para obter mais detalhes, em particular alternativas para usar o hífen - como um delimitador de segmento em cadeias de data.

Então, usando seu exemplo, eu faria uma cotação dupla da seqüência de PHP e use aspas simples nos valores 'val1', 'val2' . NULL é uma palavra-chave MySQL e um valor especial (não), e, portanto, não é cotado.

Nenhum desses identificadores de tabela ou coluna são palavras reservadas ou faz uso de caracteres que exigem citação, mas citei-os de qualquer maneira com backticks (mais sobre isso mais tarde …).

Funções nativas do RDBMS (por exemplo, NOW() no MySQL) não devem ser citadas, embora seus argumentos estejam sujeitos à mesma string ou ao identificador citando regras já mencionadas.

  Backtick (`)
 quadro e coluna ────────────────────────────────────────────────────────────────────────────────────────────────── ───────┐
                       ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
 $ query = " INSERT INTO` table` (`id`,` col1`, `col2`,` date`, `updated`)  
                         VALORES (NULL, 'val1', 'val2', '2001-01-01', AGORA ()) ";
                                ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 
 Palavra-chave não citada ─────┴┴┴┘ │ │ │ │ │ │ │││││
 Cordas single-coted (') strings
 Single-coted (') DATE ───────────────────────────────────────────────────────────────────────────────────────────────── │
 Função não cotada ───────────────────────────────────────────────────────────────────────────────────────    

Interpolação variável

Os padrões de cotação para variables ​​não mudam, embora você pretenda interpolar as variables ​​diretamente em uma seqüência de caracteres, deve ser duplo em PHP. Certifique-se de que você tenha escapado corretamente as variables ​​para uso em SQL. ( Recomenda-se usar uma API que suporte declarações preparadas, em vez disso, como proteção contra injeção SQL ).

  // A mesma coisa com algumas substituições variables
 // Aqui, uma tabela de tabela de tabela variável $ é citada e as variables
 // na lista VALUES são simples citados 
 $ 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 espaços reservados da declaração devem ou não ser citados. As APIs mais populares disponíveis em PHP, PDO e MySQLi, esperam espaços reservados não cotados , 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 (?, ?, ?, ?)"; 

Personagens 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,az,AZ$_] (letras latinas básicas, dígitos 0-9, dólar, sublinhado)

Você pode usar caracteres além do conjunto como identificadores de tabela ou coluna, incluindo espaços em branco, por exemplo, mas, em seguida, você deve citar (recortar) os mesmos.

Existem dois tipos de cotações no MySQL:

  1. ' para include literais de cordas
  2. ` para include identificadores como nomes de tabelas e colunas

E então há " qual é um caso especial. Ele pode ser usado para um dos propósitos acima mencionados ao mesmo tempo, dependendo do sql_mode do servidor MySQL:

  1. Por padrão, o " caractere pode ser usado para include literais de cordas como '
  2. No modo ANSI_QUOTES , o " caractere pode ser usado para include identificadores como `

A seguinte consulta produzirá resultados (ou erros) diferentes dependendo do modo SQL:

 SELECT "column" FROM table WHERE foo = "bar" 

ANSI_QUOTES desativado

A consulta selecionará a "column" literal "column" onde a coluna foo é igual à string "bar"

ANSI_QUOTES habilitado

A consulta selecionará a coluna column onde coluna foo é igual a bar coluna

Quando usar o que

  • Sugiro que você evite usar " para que seu código se torne independente dos modos SQL
  • Sempre citar identificadores, uma vez que é uma boa prática (algumas perguntas sobre SO discutem isso)

(Existem boas respostas acima sobre a natureza SQL da sua pergunta, mas isso também pode ser relevante se você é novo no PHP).

Talvez seja importante mencionar que o PHP lida com cordas separadas simples ou duplas de forma diferente …

As cordas single-quoted são “literais” e são praticamente as cadeias WYSIWYG. As cadeias duplas são interpretadas pelo PHP para possíveis substituições de variables ​​(os backticks em PHP não são exatamente strings, eles executam um comando no shell e retornam o resultado).

Exemplos:

 $foo = "bar"; echo 'there is a $foo'; // There is a $foo echo "there is a $foo"; // There is a bar echo `ls -l`; // ... a directory list 

As barras de fundo geralmente são usadas para indicar um identifier e, além disso, não podem usar acidentalmente as palavras-chave reservadas .

Por exemplo:

 Use `database`; 

Aqui, os backticks ajudarão o servidor a entender que o database é de fato o nome do database, e não o identificador do database.

O mesmo pode ser feito para os nomes de tabela e campo. Este é um hábito muito bom se você envolver seu identificador de database com backticks.

Verifique esta resposta para entender mais sobre backticks.


Agora, sobre Cotações duplas e Cotações simples (Michael já mencionou isso).

Mas, para definir um valor, você deve usar aspas simples ou duplas. Vamos ver outro exemplo.

 INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1); 

Aqui, esqueci deliberadamente esqueci o title1 com aspas. Agora, o servidor levará o title1 como um nome de coluna (ou seja, um identificador). Então, para indicar que é um valor, você deve usar citações duplas ou soltas.

 INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1'); 

Agora, em combinação com PHP, aspas duplas e aspas simples fazem o seu tempo de escrita da consulta muito mais fácil. Vamos ver uma versão modificada da consulta na sua pergunta.

 $query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')"; 

Agora, usando aspas duplas no PHP, você fará as variables $val1 e $val2 usar seus valores, criando assim uma consulta perfeitamente válida. Gostar

 $val1 = "my value 1"; $val2 = "my value 2"; $query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')"; 

vai fazer

 INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2') 

Os literais de string em MySQL e PHP são os mesmos.

Uma seqüência de caracteres é uma seqüência de bytes ou caracteres, dentro de caracteres de citações únicas (“‘”) ou de citações duplas (“” “).

Portanto, se sua string contiver aspas simples, então você pode usar aspas duplas para citar a string, ou se contiver aspas duplas, então você pode usar aspas simples para citar a string. Mas se sua string contiver aspas simples e as aspas duplas, você precisa escaping daquela que costumava citar a string.

Principalmente, usamos cotações simples para um valor de seqüência SQL, então precisamos usar aspas duplas para uma string PHP.

 $query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')"; 

E você poderia usar uma variável na string de duas citações do PHP:

 $query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')"; 

Mas se $val1 ou $val2 contiver cotações simples, isso fará com que seu SQL esteja errado. Então você precisa escaping antes de ser usado em sql; é por isso que mysql_real_escape_string é para. (Embora uma declaração preparada seja melhor.)

Basicamente, no Mysql, esses tipos de identificadores são usados ​​na consulta ` , " , ' e () .

  1. " ou ' use para include a string como valores "26-01-2014 00:00:00" ou "26-01-2014 00:00:00" '26-01-2014 00:00:00' . Esses identificadores utilizam apenas para string não como function agregada como now() or sum ,max etc.

  2. ` use para include tabela ou coluna de tabela, por exemplo, selecione column_name de table_name que id = ‘2’

  3. () são usados ​​apenas para include partes da consulta, por exemplo, selecione column_name de table_name onde (id = ‘2’ e gender = ‘male’) ou name = ‘rakesh’.

Em combinação com o PHP e o MySQL, as aspas duplas e as citações simples tornam o seu tempo de escrita de consulta muito mais fácil.

 $query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')"; 

Agora, suponha que você esteja usando uma variável de postagem direta na consulta do MySQL, então use-a dessa maneira:

 $query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')"; 

Esta é a melhor prática para o uso de variables ​​PHP no MySQL.

Aspas simples devem ser usadas para valores de string como na lista VALUES ().

Os backticks geralmente são usados ​​para indicar um identificador e, além disso, não podem usar acidentalmente as palavras-chave reservadas.

Em combinação com o PHP e o MySQL, as cotações duplas e as citações simples tornam o tempo de escrita da consulta muito mais fácil.

Se cols e valores da tabela forem variables, existem duas maneiras:

Com aspas duplas "" a consulta completa:

 $query = "INSERT INTO $table_name (id, $col1, $col2) VALUES (NULL, '$val1', '$val2')"; 

Ou

  $query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.") VALUES (NULL, '".$val1."', '".$val2."')"; 

Com citações simples '' :

 $query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.') VALUES (NULL, '.$val1.', '.$val2.')'; 

Use back ticks `` quando um nome de coluna / valor é semelhante a uma palavra-chave reservada do MySQL.

Nota: Se você estiver denotando um nome de coluna com um nome de tabela, use tiques de volta assim:

`table_name` . `column_name` <- Nota: exclude . de carrapatos de volta.

Houve muitas respostas úteis aqui, geralmente culminando em dois pontos.

  1. BACKTICKS (`) são usados ​​em torno de nomes de identificadores.
  2. CITAÇÕES (‘) são usadas em torno de valores.

E como o @MichaelBerkowski disse

Os backticks devem ser usados ​​para identificadores de tabela e coluna, mas só são necessários quando o identificador é uma palavra-chave reservada do MySQL ou quando o identificador contém caracteres ou caracteres de espaço em branco além de um conjunto limitado (veja abaixo). Muitas vezes, é recomendado evitar o uso de palavras-chave reservadas como identificadores de coluna ou tabela, quando possível, evitando o problema de cotação.

Existe ainda um caso em que um identificador não pode ser uma palavrachave reservada ou conter espaços em branco ou caracteres além do conjunto limitado, mas necessariamente requerem backticks em torno deles.

EXEMPLO

123E10 é um nome de identificador válido, mas também um literal INTEGER válido.

[Sem entrar em detalhes como você obteria esse nome de identificador], suponha que eu queira criar uma tabela temporária chamada 123456e6.

Nenhum ERROR em backticks.

 DB [XXX]> create temporary table `123456e6` (`id` char (8)); Query OK, 0 rows affected (0.03 sec) 

ERROR quando não estiver usando backticks.

 DB [XXX]> create temporary table 123451e6 (`id` char (8)); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1 

No entanto, 123451a6 é um nome de identificação perfeitamente perfeito (sem backticks).

 DB [XXX]> create temporary table 123451a6 (`id` char (8)); Query OK, 0 rows affected (0.03 sec) 

Isso é completamente porque 1234156e6 também é um número exponencial.

Além de todas as respostas (bem explicadas), não houve o seguinte mencionado e eu visitei este Q & A com bastante frequência.

Em poucas palavras; O MySQL acha que quer fazer matemática em sua própria tabela / coluna e interpreta hifens como “e-mail” como e menos mail .


Disclaimer: Então eu pensei que eu iria adicionar isso como um tipo de resposta “FYI” para aqueles que são completamente novos para trabalhar com bancos de dados e que talvez não entendam os termos técnicos descritos já.

Intereting Posts