Verwenden von Backticks um Feldnamen

172

Nachdem ich hier einige Antworten und Kommentare zu einigen SQL-Fragen gelesen und gehört habe, dass ein Freund von mir an einem Ort arbeitet, an dem eine Richtlinie dies verbietet, frage ich mich, ob bei der Verwendung von Backticks um Feldnamen in MySQL etwas nicht stimmt .

Das ist:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
nickf
quelle
24
Backticks sind wirklich praktisch , wenn Sie Spaltennamen haben wollen wie count, type, tableoder ähnlich
Knittl
1
siehe auch stackoverflow.com/questions/23446377/…
Ian Ringrose
@knittl Ich denke , die Frage ist, sollten Sie Spaltennamen wie count, type, und table. Das sind schrecklich mehrdeutige Begriffe, und in fast allen Fällen könnten diese Namen verbessert werden, um genauer zu sein. Das Benennen Ihrer Spalten ist ebenfalls gefährlich und eine potenzielle Fehlerquelle, da Sie nie wissen, wann jemand vergessen könnte, die Backticks hinzuzufügen, oder nicht merkt, dass dies erforderlich ist. Ich denke, es ist besser, nur zu vermeiden, reservierte Begriffe als Spaltennamen zu verwenden.
Dallas
Ich benutze sie immer und bin daher nicht in Gefahr, reservierte Schlüsselwörter zu irgendeinem Zeitpunkt verwendet zu haben.
Markus Zeller

Antworten:

153

Mit Backticks können Sie alternative Zeichen verwenden. Beim Schreiben von Abfragen ist das kein Problem, aber wenn man davon ausgeht, dass man nur Backticks verwenden kann, würde ich davon ausgehen, dass man damit mit lächerlichen Dingen wie z

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

Was natürlich schlecht benannte Tabellen erzeugt.

Wenn Sie nur präzise sind, sehe ich kein Problem damit. Sie werden feststellen, ob Sie Ihre Abfrage als solche ausführen

EXPLAIN EXTENDED Select foo,bar,baz 

Die generierte Warnung, die zurückkommt, enthält Back-Ticks und vollständig qualifizierte Tabellennamen. Wenn Sie also Funktionen zur Generierung von Abfragen und das automatische Umschreiben von Abfragen verwenden, würden Backticks alles, was Ihren Code analysiert, weniger verwirren.

Ich denke jedoch, anstatt zu bestimmen, ob Sie Backticks verwenden können oder nicht, sollten sie einen Standard für Namen haben. Es löst mehr "echte" Probleme.

Kent Fredric
quelle
Müssen wir sie auch in PostgreSQL verwenden?
Yousuf Memon
5
Es gibt keine Notwendigkeit, nur Empfehlung. Es ist nützlich, sie in Anführungszeichen zu setzen, um Mehrdeutigkeiten mit SQL-Schlüsselwörtern zu vermeiden, wenn in Zukunft ein SQL-Schlüsselwort hinzugefügt wird, das den Namen Ihres Felds teilt. Das einzige Mal, wenn Sie zitieren müssen, ist, wenn ein Feld beispielsweise einen Schlüsselwortnamen aufweist, und vs sehr unterschiedliche Ergebnisse liefert . Postgres unterscheidet sich jedoch in zweierlei Hinsicht von MySQL: 1. Felder werden von zitiert . 2. Nicht zitierte Felder unterscheiden nicht zwischen Groß- und Kleinschreibung. Postgresql.org/docs/current/static/…select count from fooselect "count" from foo""
Kent Fredric
57

Das einzige Problem mit Backticks ist, dass sie nicht ANSI-SQL-kompatibel sind, z. B. nicht in SQL Server funktionieren.

Wenn die Möglichkeit besteht, dass Sie Ihre SQL in eine andere Datenbank portieren müssen, verwenden Sie doppelte Anführungszeichen.

Alexander Kojevnikov
quelle
15
Ja. Verwenden Sie den ANSI-Modus von MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html -, um doppelte Anführungszeichen in MySQL zu aktivieren und so die datenbankübergreifende Kompatibilität wiederherzustellen . Backticks / Anführungszeichen sind ebenfalls erforderlich, da Sie nie wissen, was in zukünftigen DBMS-Versionen zu einem reservierten Wort werden wird.
Bobince
1
Das ist wirklich wahr! Eine unserer Serveranwendungen lief einwandfrei, bis wir ein Upgrade auf unser Datenbankmodul anwendeten, das ein neues Schlüsselwort hinzufügte. Plötzlich brach alles, was einen bestimmten Tisch abfragte.
Miquella
@bobince Als ich neu bei dev war, habe ich eine Spalte rangeoder ähnliches benannt. Beim Upgrade auf MySQL 5 ist dies fehlgeschlagen, da es sich um ein neues reserviertes Wort handelt!
Alex
1
Verwenden Sie keine doppelten Anführungszeichen. Es wird nicht immer funktionieren. Zum Beispiel ... DELETE FROM app_key_storesWHERE ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) DELETE FROM app_key_storesWHERE ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Abfrage OK, 5 Zeilen betroffen (0,00 Sek.)
Altonymous
44

Für mich ist es sehr sinnvoll, sie beim Umgang mit Feldnamen immer zu verwenden.

  • Erstens, wenn Sie sich erst einmal angewöhnt haben, tut es nicht weh, nur die Backtick-Taste zu drücken.
  • Zweitens ist es für mich einfacher zu erkennen, welche Felder genau in Ihrer Abfrage enthalten sind und welche Schlüsselwörter oder Methoden verwendet werden.
  • Schließlich können Sie beim Entwerfen Ihrer Tabelle einen beliebigen Feldnamen verwenden. Manchmal ist es sehr sinnvoll, ein Feld "Schlüssel", "Reihenfolge" oder "Werte" zu benennen. All dies erfordert Backticks, wenn auf sie verwiesen wird.
nickf
quelle
19
Sie sollten auch hinzufügen, dass es Sie vor zukünftigen reservierten Wörtern schützt (die mich schon einmal gebissen haben).
Alex
5
Ich hatte tatsächlich jemanden, der die zusätzlichen Backticks aus einer meiner Fragen heraus einmal bearbeitet hat, was mich verärgerte, da dieser Grund genau der Grund ist, warum ich jede Variable mit ihnen umgeben habe
Brian Leishman,
2
Es ermöglicht auch die sichere Verwendung nicht englischer Etiketten, was allein ausreicht, um die Verwendung von Backticks zu fördern.
Aternus
26

Backticks sind nicht Teil von Standard-ANSI-SQL. Aus dem MySQL-Handbuch :

Wenn der SQL-Modus ANSI_QUOTES aktiviert ist, können Bezeichner auch in doppelte Anführungszeichen gesetzt werden

Wenn Sie also Backticks verwenden und sich dann von MySQL entfernen, haben Sie ein Problem (obwohl Sie wahrscheinlich auch viel größere Probleme haben).

Greg
quelle
9

Es ist nichts falsch, wenn Sie weiterhin MYSQL verwenden, außer vielleicht der visuellen Unschärfe der Abfragen. Sie erlauben jedoch die Verwendung reservierter Schlüsselwörter oder eingebetteter Leerzeichen als Tabellen- und Spaltennamen. Dies ist bei den meisten Datenbank-Engines ein No-No und verhindert eine spätere Migration.

Zum einfachen Lesen verwenden viele Leute Großbuchstaben für SQL-Schlüsselwörter, z.

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

Wenn Sie mich fragen, sollten immer Backticks verwendet werden. Es gibt jedoch einige Gründe, warum ein Team es vorziehen könnte, sie nicht zu verwenden.

Vorteile:

  • Mit ihnen gibt es keine reservierten Wörter oder verbotenen Zeichen.
  • In einigen Fällen erhalten Sie aussagekräftigere Fehlermeldungen.
  • Wenn Sie schlechte Praktiken vermeiden, ist Ihnen das egal, aber ... im wahrsten Sinne des Wortes sind sie manchmal eine gute Möglichkeit, SQL-Injektionen zu vermeiden.

Nachteile:

  • Sie sind nicht Standard und normalerweise nicht tragbar. Solange Sie jedoch keinen Backtick als Teil eines Bezeichners verwenden (was die schlechteste Vorgehensweise ist, die ich mir vorstellen kann), können Sie Ihre Abfrage portieren, indem Sie Backticks automatisch entfernen.
  • Wenn einige Ihrer Abfragen von Access stammen, zitieren sie möglicherweise Tabellennamen mit "(und möglicherweise können Sie nicht alle" blind entfernen). Es sind jedoch Mischungen aus Backticks und doppelten Anführungszeichen zulässig.
  • Einige dumme Software oder Funktionen filtern Ihre Abfragen und haben Probleme mit Backticks. Sie sind jedoch Teil von ASCII, was bedeutet, dass Ihre Software / Funktion sehr schlecht ist.
Federico
quelle
9
Die Verwendung von Backticks hat absolut nichts mit der Vermeidung von SQL-Injektionen zu tun.
Andy Lester
6
@andy es könnte helfen, da ein Angreifer es mit einem anderen Backtick schließen muss, um zu injizieren. Es macht wenig, aber das ist immer noch etwas
jasonszhao
4

Es ist viel einfacher, Ihre Codebasis nach etwas in Backticks zu durchsuchen. Angenommen, Sie haben eine Tabelle mit dem Namen event. grep -r "event" *kann Hunderte von Ergebnissen zurückgeben. grep -r "\`event\`" *gibt alles zurück, was wahrscheinlich auf Ihre Datenbank verweist.

EllisGL
quelle
Im Allgemeinen ist es nicht wirklich ein Vorteil. Die Tabellen, auf die man professionell stößt, heißen eher new_users_info als "general".
ankush981
3

Soweit ich weiß, besteht der gesamte Zweck der Verwendung von Backticks darin, dass Sie Namen verwenden können, die mit reservierten Schlüsselwörtern übereinstimmen. Wenn der Name nicht mit einem reservierten Schlüsselwort kollidiert, sehe ich keinen Grund, Backticks zu verwenden. Aber das ist auch kein Grund, sie zu verbieten.

Chris Jester-Young
quelle
2

Einfache Sache über Graviszeichen `` ist die Verwendung für bezeichnen Bezeichner wie database_name, table_name usw. und Apostroph ‚‘ , doppelte Anführungszeichen „“ für Stringliterale, während „“ Verwendung für Druckwert , wie es ist und ‚‘ druckt den Wert Variable halten oder in einem anderen Fall drucken Sie den Text aus, den er hat.

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
quelle
0

Wenn Sie einige Feldnamen als Standardwerte für MySQL oder MSSQL verwenden, z. B. "Status", müssen Sie Backticks verwenden (" statusAus Tabellenname auswählen " oder "ID aus Tabellenname auswählen, wobei status= 1"). weil MySQL Fehler zurückgibt oder die Abfrage nicht funktioniert.

ysrtymz
quelle
0

Die Hauptverwendung von Backticks (`) in SQL besteht darin, sie in Situationen zu verwenden, in denen Sie sie in den nächsten Klauseln erneut aufrufen werden. In jeder zweiten Zeit wird empfohlen, doppelte Anführungszeichen ("") zu verwenden.

Beispielsweise

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;

In der obigen Anweisung sehen Sie, wie Publisher and Locationin GROUP BYKlausel wieder verwendet wird.

Anstatt zu verwenden

GRUPPE NACH Name, Stadt, Landescode

Ich habe es gerade benutzt

GRUPPIERE NACH Publisher and Location

Nur wenn solche Situationen auftreten, ist es nützlich, Backticks zu verwenden. In allen anderen Fällen wird die Verwendung von doppelten Anführungszeichen empfohlen.

Befehl
quelle