Estou tentando aprender a melhor maneira de escrever consultas. Eu também entendo a importância de ser consistente. Até agora, usei aleatoriamente aspas simples, aspas duplas e reticulares sem nenhum pensamento real.
Exemplo:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Além disso, no exemplo acima, considere que table
, col1
, val1
, etc. podem ser variáveis.
Qual é o padrão para isso? O que você faz?
Eu tenho lido respostas para perguntas semelhantes aqui por cerca de 20 minutos, mas parece que não há resposta definitiva para essa pergunta.
"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'
.)Respostas:
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
eDATETIME
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.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 ).
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:
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:
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).
fonte
Existem dois tipos de citações no MySQL:
'
para incluir literais de cadeia de caracteres`
para incluir identificadores, como nomes de tabela e colunaE depois há
"
um caso especial. Pode ser usado para um dos propósitos mencionados acima, dependendo do servidor MySQLsql_mode
:"
caractere pode ser usado para incluir literais de string, assim como'
ANSI_QUOTES
modo, o"
caractere pode ser usado para incluir identificadores como`
A consulta a seguir produzirá resultados diferentes (ou erros), dependendo do modo SQL:
ANSI_QUOTES desativado
A consulta selecionará a string literal
"column"
onde colunafoo
é igual a string"bar"
ANSI_QUOTES ativado
A consulta selecionará a coluna
column
onde colunafoo
é igual a colunabar
Quando usar o que
"
para que seu código se torne independente dos modos SQLfonte
(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 seqüências de caracteres simples e duplas de maneira diferente ...
As strings de aspas simples são 'literais' e são basicamente strings WYSIWYG. Strings com aspas duplas são interpretadas pelo PHP para possível substituição de variável (backticks no PHP não são exatamente strings; eles executam um comando no shell e retornam o resultado).
Exemplos:
fonte
Os backticks são geralmente usados para indicar
identifier
e também a segurança de usar acidentalmente as palavras-chave reservadas .Por exemplo:
Aqui, os backticks ajudarão o servidor a entender que esse
database
é realmente o nome do banco de dados, não o identificador do banco de dados.O mesmo pode ser feito para os nomes de tabela e nomes de campo. Esse é um hábito muito bom se você agrupar seu identificador de banco de dados com reticulares.
Agora, sobre aspas duplas e aspas simples (Michael já mencionou isso).
Mas, para definir um valor, você deve usar aspas simples ou duplas. Vamos ver outro exemplo.
Aqui, esqueci-me deliberadamente de colocar as
title1
aspas. Agora, o servidor usará otitle1
nome como coluna (ou seja, um identificador). Portanto, para indicar que é um valor, você deve usar aspas duplas ou simples.Agora, em combinação com o PHP, aspas duplas e aspas simples facilitam muito o tempo de escrita da consulta. Vamos ver uma versão modificada da consulta na sua pergunta.
Agora, usando aspas duplas no PHP, você criará as variáveis
$val1
e$val2
usará seus valores, criando assim uma consulta perfeitamente válida. Gostarfará
fonte
No MySQL, esses símbolos são usados para delimitar uma consulta
`
,"
,'
e()
."
ou'
são usados para incluir valores semelhantes a cadeias"26-01-2014 00:00:00"
ou'26-01-2014 00:00:00'
. Estes símbolos são apenas para cordas, funções não agregados gostanow
,sum
oumax
.`
é usado para incluir nomes de tabelas ou colunas, por exemploselect `column_name` from `table_name` where id='2'
(
e)
simplesmente coloque partes de uma consulta, por exemploselect `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'
.fonte
Os literais de string no MySQL e PHP são os mesmos.
Portanto, se sua string contiver aspas simples, você poderá usar aspas duplas para citá-la ou, se contiver aspas duplas, poderá usar aspas simples para aspas. Mas se sua string contiver aspas simples e aspas duplas, você precisará escapar da que costumava aspas a string.
Geralmente, usamos aspas simples para um valor de string SQL, portanto, precisamos usar aspas duplas para uma string PHP.
E você pode usar uma variável na string de aspas duplas do PHP:
Mas se
$val1
ou$val2
contiver aspas simples, isso fará com que seu SQL esteja errado. Então você precisa escapar antes que seja usado no sql; é para isso quemysql_real_escape_string
serve. (Embora uma declaração preparada seja melhor.)fonte
Em combinação com PHP e MySQL, aspas duplas e aspas simples facilitam muito o tempo de escrita da consulta.
Agora, suponha que você esteja usando uma variável de postagem direta na consulta do MySQL, use-a desta maneira:
Esta é a melhor prática para usar variáveis PHP no MySQL.
fonte
Houve muitas respostas úteis aqui, geralmente culminando em dois pontos.
E como @MichaelBerkowski disse
No entanto, existe um caso em que um identificador não pode ser uma palavra - chave reservada ou conter espaços em branco ou caracteres além de um conjunto limitado, mas requer necessariamente backticks ao seu redor.
EXEMPLO
123E10
é um nome de identificador válido, mas também umINTEGER
literal válido .[Sem entrar em detalhes como você obteria esse nome de identificador], suponha que eu queira criar uma tabela temporária chamada
123456e6
.Sem ERRO nos backticks.
ERRO quando não estiver usando backticks.
No entanto,
123451a6
é um nome de identificador perfeitamente adequado (sem marcas de retorno).Isso é completamente porque
1234156e6
também é um número exponencial.fonte
Se valores e colunas da tabela são variáveis, existem duas maneiras:
Com aspas duplas,
""
a consulta completa:Ou
Com aspas simples
''
:Use back ticks
``
quando um nome de coluna / valor for semelhante a uma palavra-chave reservada do MySQL.Nota: Se você estiver indicando um nome de coluna com um nome de tabela, use ticks de volta como este:
`table_name`
.`column_name`
<- Nota: excluir.
dos ticks anteriores.fonte
Aspas simples devem ser usadas para valores de sequência, como na lista VALUES ().
Os backticks são geralmente usados para indicar um identificador e também protegem contra o uso acidental das palavras-chave reservadas.
Em combinação com PHP e MySQL, aspas duplas e aspas simples facilitam muito o tempo de escrita da consulta.
fonte
Além de todas as respostas (bem explicadas), não houve o seguinte mencionado e eu visito essas perguntas e respostas com bastante frequência.
Em poucas palavras; O MySQL acha que você deseja fazer contas em sua própria tabela / coluna e interpreta hífens como "e-mail" como
e
menosmail
.Isenção de responsabilidade: Pensei em acrescentar isso como um tipo de resposta "para sua informação" para aqueles que são completamente novos em trabalhar com bancos de dados e que podem não entender os termos técnicos já descritos.
fonte
Servidores SQL e MySQL, PostgreySQL, Oracle não entendem aspas duplas ("). Portanto, sua consulta deve estar livre de aspas duplas (") e deve usar apenas aspas simples (').
O retorno (`) é opcional para uso no SQL e é usado para o nome da tabela, o nome do banco de dados e os nomes das colunas.
Se você está tentando escrever uma consulta no seu back-end para chamar o MySQL, pode usar aspas duplas (") ou aspas simples (') para atribuir consulta a uma variável como:
Se houver uma
where
declaração na sua consulta e / ou tentarinsert
um valor e / ouupdate
valor que seja string, use aspas simples (') para esses valores, como:Se você quiser ficar de fora dessa confusão quando usar aspas duplas (") e aspas simples ('), recomendo ficar com aspas simples ('), isso incluirá barra invertida () como:
Problema com aspas duplas (") ou simples (') surge quando tivemos que atribuir algum valor dinâmico e executar alguma concatenação de cadeias, como:
Se precisar de mais espaço, siga as aspas em JavaScript
fonte