Utilizzo di backtick attorno ai nomi dei campi


172

Dopo aver letto un paio di risposte e commenti su alcune domande SQL qui, e anche sentito che un mio amico lavora in un posto che ha una politica che li vieta, mi chiedo se c'è qualcosa di sbagliato nell'usare i backtick attorno ai nomi dei campi in MySQL .

Questo è:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...

24
backticks sono davvero a portata di mano se si vuole avere i nomi delle colonne come count, type, tableo simili
Knittl


@knittl Penso che la domanda è: dovrei hai nomi delle colonne come count, typee table. Questi sono termini terribilmente ambigui e in quasi tutti i casi quei nomi potrebbero essere migliorati per essere più specifici. Anche nominare le tue colonne in questo modo è pericoloso e rappresenta una potenziale fonte di errori, poiché non sai mai quando qualcuno potrebbe dimenticare di aggiungere i backtick o di non rendersi conto di doverlo fare. Penso che sia meglio evitare di usare termini riservati come nomi di colonna.
dallin

Li uso sempre e quindi non corro in pericolo dopo aver usato parole chiave riservate in qualsiasi momento.
Markus Zeller,

Risposte:


153

L'uso dei backtick ti consente di usare caratteri alternativi. Nella scrittura di query non è un problema del genere, ma se si presume che si possano semplicemente usare i backtick, suppongo che ti permetta di cavartela con cose ridicole come

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

Il che ovviamente genera tabelle mal denominate.

Se sei solo conciso, non vedo alcun problema, noterai se esegui la tua query in quanto tale

EXPLAIN EXTENDED Select foo,bar,baz 

L'avviso generato che ritorna avrà segni di spunta e nomi di tabella completi. Pertanto, se si utilizzano le funzionalità di generazione delle query e la riscrittura automatica delle query, i backtick renderebbero meno confuso tutto ciò che analizza il codice.

Penso tuttavia, invece di imporre se è possibile utilizzare o meno i backtick, dovrebbero avere uno standard per i nomi. Risolve problemi più "reali".


Dobbiamo usarli anche in PostgreSQL?
Yousuf Memon il

5
Non è necessario, solo una raccomandazione. È utile rappresentarli citati per evitare ambiguità con le parole chiave SQL se in futuro viene aggiunta una parola chiave SQL che condivide il nome dei campi. L'unica volta che / necessità / di citazione è quando un campo fa condividere una parola chiave, per esempio, select count from foovs select "count" from foodarà risultati molto diversi. Ma postgres differisce da mysql in 2 modi: 1. I campi sono citati da "". 2. I campi non quotati sono casegresql.org
Kent Fredric

57

L'unico problema con i backtick è che non sono conformi ANSI-SQL, ad esempio non funzionano in SQL Server.

Se esiste la possibilità che tu debba trasferire il tuo SQL su un altro database, usa le doppie virgolette.


15
Sì. Utilizzare la modalità ANSI di MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - per abilitare le virgolette doppie in MySQL e riguadagnare così la compatibilità tra database. I backtick / virgolette sono anche necessari perché non si sa mai cosa diventerà una parola riservata nelle future versioni di DBMS.
bobince

1
È molto vero! Una delle nostre applicazioni server funzionava bene fino a quando non abbiamo applicato un aggiornamento al nostro motore di database, che ha aggiunto una nuova parola chiave. Improvvisamente tutto ciò che ha richiesto un determinato tavolo si è rotto.
Miquella,

@bobince Quando ero nuovo sviluppatore , ho chiamato una colonna rangeo qualcosa del genere. Quando abbiamo eseguito l'aggiornamento a MySQL 5 non è riuscito perché era una nuova parola riservata!
alex,

1
Non usare virgolette doppie. Non funzionerà sempre. Ad esempio ... ELIMINA DA app_key_storesDOVE ("chiave" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Interrogazione OK, 0 righe interessate (0,00 sec) ELIMINA DA app_key_storesDOVE ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Query OK, 5 righe interessate (0,00 sec)
Altonymous

44

Per me ha molto senso usarli sempre quando si hanno a che fare con i nomi dei campi.

  • In primo luogo, una volta presa l'abitudine, non fa male solo premere il tasto backtick.
  • In secondo luogo, per me, è più facile vedere quali sono esattamente i campi nella query e quali sono parole chiave o metodi.
  • Infine, ti consente di utilizzare qualsiasi nome di campo desideri durante la progettazione della tabella. A volte ha molto senso nominare un campo "chiave", "ordine" o "valori" ... che richiedono tutti i backtick quando ci si riferisce ad essi.

19
Dovresti anche aggiungere che ti protegge da eventuali parole riservate future utilizzate (che mi ha morso prima).
alex,

5
In realtà ho avuto qualcuno che modificava i backtick extra da una delle mie domande una volta, il che mi ha sconvolto, poiché questo è il motivo esatto che circondo ogni variabile con loro
Brian Leishman

2
Consente inoltre l'uso sicuro di etichette non inglesi, che da solo è sufficiente per incoraggiare l'uso di backtick.
Aternus,

26

I backtick non fanno parte dello standard ANSI SQL. Dal manuale di mysql :

Se la modalità SQL ANSI_QUOTES è abilitata, è anche possibile citare gli identificatori tra virgolette doppie

Quindi, se usi i backtick e poi decidi di allontanarti da MySQL, hai un problema (anche se probabilmente hai anche problemi molto più grandi)


9

Non c'è niente di sbagliato se continui a usare MYSQL, tranne forse la confusione visiva delle query. Tuttavia, consentono l'uso di parole chiave riservate o spazi incorporati come nomi di tabelle e colonne. Questo è un no-no con la maggior parte dei motori di database e impedirà qualsiasi migrazione in un secondo momento.

Per quanto riguarda la facile lettura, molte persone usano i cap per le parole chiave SQL, ad es.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

Se me lo chiedi, i backtick dovrebbero sempre essere usati. Ma ci sono alcuni motivi per cui una squadra potrebbe preferire non usarli.

vantaggi:

  • Usandoli, non ci sono parole riservate o caratteri proibiti.
  • In alcuni casi, ricevi messaggi di errore più descrittivi.
  • Se eviti le cattive pratiche non ti interessano, ma ... in parole reali, a volte sono un modo decente per evitare iniezioni di SQL.

svantaggi:

  • Non sono standard e di solito non portatili. Tuttavia, finché non si utilizza un backtick come parte di un identificatore (che è la peggiore pratica che io sia in grado di immaginare), è possibile eseguire il porting della query rimuovendo automaticamente i backtick.
  • Se alcune delle tue query provengono da Access, possono citare i nomi delle tabelle con "(e forse non puoi rimuovere tutto" alla cieca). Tuttavia, sono consentite miscele di backtick e doppie virgolette.
  • Alcuni stupidi software o funzioni filtrano le tue query e hanno problemi con i backtick. Tuttavia, fanno parte di ASCII, quindi questo significa che il tuo software / funzione è pessimo.

9
L'uso dei backtick non ha assolutamente nulla a che fare con l'evitare iniezioni di SQL.
Andy Lester,

6
@andy potrebbe essere d' aiuto, poiché un utente malintenzionato deve chiuderlo con un altro backtick per iniettare. Fa poco, ma è ancora qualcosa
jasonszhao,

4

È molto più facile cercare nella base di codice qualcosa nei backtick. Supponi di avere una tabella chiamata event. grep -r "event" *potrebbe restituire centinaia di risultati. grep -r "\`event\`" *restituirà tutto ciò che probabilmente fa riferimento al tuo database.


In generale non è davvero un vantaggio. Le tabelle che si incontrano professionalmente sono chiamate più come new_users_info che "general".
ankush981,

3

Bene, per quanto ne so, l'intero scopo dell'utilizzo dei backtick è di poter usare nomi che coincidono con parole chiave riservate. Quindi, se il nome non si scontra con una parola chiave riservata, non vedo alcun motivo per utilizzare i backtick. Ma non è nemmeno un motivo per vietarli.


2

La cosa semplice su backtick `` è l'uso per indicare identificatore come database_name, table_name ecc. E virgoletta singola '' , virgoletta doppia "" per valori letterali stringa, mentre "" usa per stampare il valore così com'è e '' stampa la variabile valore hold o in un altro caso stampa il testo che ha.

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..

0

se si utilizzano alcuni nomi di campo come valori mysql o mssql predefiniti, ad esempio "status", è necessario utilizzare i backtick ("select statusfrom table_name" o "select id from table_name where status= 1"). perché mysql restituisce errori o non funziona la query.


0

L'uso principale dei backtick (`) in SQL è di usarli in situazioni in cui li richiamerai nuovamente nelle clausole imminenti. In ogni altro momento si consiglia di utilizzare virgolette doppie ("").

Per esempio

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;

Nell'istruzione precedente vedi come Publisher and Locationviene usato di nuovo nella GROUP BYclausola.

Invece di usare

GRUPPO PER Nome, città, codice statale

Ho appena usato

RAGGRUPPA PER Publisher and Location

Solo quando si verificano tali situazioni, è utile utilizzare i backtick. In tutte le altre volte si consiglia di utilizzare virgolette doppie.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.