Usando backticks em torno dos nomes dos campos

172

Depois de ler algumas respostas e comentários sobre algumas questões de SQL aqui, e também de ouvir que um amigo meu trabalha em um local que possui uma política que os proíbe, estou me perguntando se há algo de errado em usar backticks em torno de nomes de campos no MySQL. .

Isso é:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
nickf
fonte
24
backticks são realmente útil se você quiser ter nomes de coluna como count, type, tableou similares
knittl
1
veja também stackoverflow.com/questions/23446377/…
Ian Ringrose
@knittl Eu acho que a questão é, deve você tem nomes de coluna como count, type, e table. Esses são termos terrivelmente ambíguos e, em quase todos os casos, esses nomes poderiam ser aprimorados para serem mais específicos. Nomear suas colunas de coisas assim também é perigoso e uma fonte potencial de erros, pois você nunca sabe quando alguém pode esquecer de adicionar os backticks ou não perceber que precisa. Eu acho que é uma prática recomendada evitar o uso de termos reservados como nomes de colunas.
dallin
Eu as uso sempre e, portanto, não estou correndo o risco de ter usado palavras-chave reservadas a qualquer momento.
Markus Zeller #

Respostas:

153

O uso de backticks permite que você use caracteres alternativos. Na escrita de consultas, esse não é um problema, mas se alguém assumir que você pode usar backticks, eu assumiria que ele permite que você se safe de coisas ridículas como

SELECT `id`, `my name`, `another field` , `field,with,comma` 

O que, é claro, gera tabelas mal nomeadas.

Se você está apenas sendo conciso, não vejo problema com isso, você notará se executar sua consulta como tal

EXPLAIN EXTENDED Select foo,bar,baz 

O aviso gerado que voltar terá marcações de retorno e marcas de nomes de tabela totalmente qualificados. Portanto, se você estiver usando recursos de geração de consulta e reescrita automática de consultas, os backticks tornariam menos confuso a análise de seu código.

Eu acho que, no entanto, em vez de determinar se você pode ou não usar backticks, eles devem ter um padrão para nomes. Resolve problemas mais "reais".

Kent Fredric
fonte
Também precisamos usá-los no PostgreSQL?
Yousuf Memon
5
Não há necessidade, apenas recomendação. É útil representá-los entre aspas para evitar ambiguidade com palavras-chave SQL se, no futuro, for adicionada uma palavra-chave SQL que compartilhe o nome do seu campo. A única vez que você / necessidade / a citação é quando um campo faz compartilhar um nome de palavra-chave, por exemplo, select count from foovs select "count" from foovai dar resultados muito diferentes. Mas o postgres difere do mysql de duas maneiras: 1. Os campos são citados por "". 2. Os campos não citados não diferenciam maiúsculas de minúsculas postgresql.org/docs/current/static/…
Kent Fredric
57

O único problema com backticks é que eles não são compatíveis com ANSI-SQL, por exemplo, eles não funcionam no SQL Server.

Se houver uma chance de você precisar portar seu SQL para outro banco de dados, use aspas duplas.

Alexander Kojevnikov
fonte
15
Sim. Use o modo ANSI do MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - para ativar aspas duplas no MySQL e assim recuperar a compatibilidade entre bancos de dados. Backticks / aspas também são necessários porque você nunca sabe o que se tornará uma palavra reservada em versões futuras do DBMS.
bobince
1
Isto é uma grande verdade! Um de nossos aplicativos para servidor estava funcionando bem até aplicarmos uma atualização ao nosso mecanismo de banco de dados, que adicionou uma nova palavra-chave. De repente, tudo o que consultou uma determinada tabela quebrou.
Miquella
@bobince Quando eu era novo no dev, nomeei uma coluna rangeou algo assim. Quando atualizamos para o MySQL 5, ele falhou porque era uma nova palavra reservada!
Alex
1
Não use aspas duplas. Nem sempre funcionará. Por exemplo ... DELETE FROM app_key_storesWHERE ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Consulta OK, 0 linhas afetadas (0.00 s) DELETE FROM app_key_storesWHERE ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Consulta OK, 5 linhas afetadas (0,00 s)
Altonymous 27/12/12
44

Para mim, faz muito sentido usá-los o tempo todo ao lidar com nomes de campos.

  • Em primeiro lugar, uma vez que você adquira o hábito, não dói apenas pressionar a tecla backtick.
  • Em segundo lugar, para mim, fica mais fácil ver quais são exatamente os campos na sua consulta e quais são as palavras-chave ou métodos.
  • Por fim, permite que você use qualquer nome de campo que desejar ao projetar sua tabela. Às vezes, faz muito sentido nomear um campo como "chave", "ordem" ou "valores" ... todos os quais exigem reticências ao se referir a eles.
nickf
fonte
19
Você também deve adicionar que o protege de qualquer palavra reservada futura que esteja sendo usada (o que já me ocorreu antes).
Alex
5
Na verdade, eu tinha alguém editar os acentos graves extra fora de uma das minha pergunta uma vez, o que me chateou, uma vez que esta razão é a razão exata que cercam cada variável com eles
Brian Leishman
2
Ele também permite o uso seguro de etiquetas que não sejam do inglês, o que por si só é suficiente para incentivar o uso de retalhos.
Aternus
26

Os backticks não fazem parte do SQL ANSI padrão. A partir do manual do mysql :

Se o modo SQL ANSI_QUOTES estiver ativado, também será permitido citar identificadores entre aspas duplas

Portanto, se você usa backticks e decide se afastar do MySQL, você tem um problema (embora provavelmente também tenha problemas muito maiores)

Greg
fonte
9

Não há nada errado se você continuar usando o MYSQL, exceto talvez a imprecisão visual das consultas. Mas eles permitem o uso de palavras-chave reservadas ou espaços incorporados como nomes de tabela e coluna. Isso é um não-não com a maioria dos mecanismos de banco de dados e impedirá qualquer migração posteriormente.

Quanto à leitura fácil, muitas pessoas usam limites para palavras-chave SQL, por exemplo.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
Christian Lescuyer
fonte
6

Se você me perguntar, sempre devem ser usados ​​retalhos. Mas existem algumas razões pelas quais uma equipe pode preferir não usá-las.

Vantagens:

  • Usando-os, não há palavras reservadas ou caracteres proibidos.
  • Em alguns casos, você recebe mensagens de erro mais descritivas.
  • Se você evitar más práticas, não se importa, mas ... em palavras reais, às vezes elas são uma maneira decente de evitar injeções de SQL.

Desvantagens:

  • Eles não são padrão e geralmente não são portáteis. No entanto, desde que você não use um backtick como parte de um identificador (que é a pior prática que posso imaginar), você pode portar sua consulta removendo automaticamente os backticks.
  • Se algumas das suas consultas vierem do Access, elas podem citar os nomes das tabelas com "(e talvez você não possa remover todas as" cegamente). No entanto, misturas de backticks e aspas duplas são permitidas.
  • Algum software ou função estúpido filtra suas consultas e tem problemas com backticks. No entanto, eles fazem parte do ASCII, portanto, isso significa que seu software / função é muito ruim.
Federico
fonte
9
O uso de backticks não tem absolutamente nada a ver com evitar injeções de SQL.
Andy Lester
6
@ e pode ajudar, já que um invasor precisa fechá-lo com outro backtick para injetar. Faz pouco, mas isso ainda é algo
jasonszhao
4

É muito mais fácil pesquisar na sua base de códigos por algo nos backticks. Digamos que você tenha uma tabela chamada event. grep -r "event" *pode retornar centenas de resultados. grep -r "\`event\`" *retornará qualquer coisa que provavelmente faça referência ao seu banco de dados.

EllisGL
fonte
Em geral, não é realmente um benefício. As tabelas que um profissional encontra são nomeadas mais como new_users_info do que "general".
Ankush981
3

Bem, até onde eu sei, todo o objetivo de usar backticks é para que você possa usar nomes que coincidam com palavras-chave reservadas. Portanto, se o nome não estiver colidindo com uma palavra-chave reservada, não vejo motivo para usar backticks. Mas isso também não é motivo para bani-los.

Chris Jester-Young
fonte
2

Coisa simples sobre backtick `` é usada para denotar identificador como database_name, table_name etc e aspas simples '' , aspas duplas "" para literais de string, enquanto "" use para print value como está e '' imprime a variável value hold ou em outro caso, imprima o texto que ele possui.

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..
Sonpal singh Sengar
fonte
0

se você estiver usando alguns nomes de campos como valores padrão do mysql ou mssql, por exemplo "status", precisará usar backticks ("selecione statusdo nome da tabela" ou "selecione o ID do nome da tabela onde status= 1"). porque o mysql retorna erros ou não funciona na consulta.

ysrtymz
fonte
0

O principal uso de backticks (`) no SQL é usá-los em situações em que você os chamará novamente nas próximas cláusulas. Em todos os outros momentos, é recomendável usar aspas duplas ("").

Por exemplo

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

Na declaração acima, você vê como Publisher and Locationé usado novamente emGROUP BY cláusula.

Ao invés de usar

GRUPO POR Nome, cidade, código de estado

Eu apenas usei

GRUPO POR Publisher and Location

Somente quando tais situações surgem, é útil usar backticks. Em todos os outros momentos, é recomendável usar aspas duplas.

Comando
fonte