web-dev-qa-db-ger.com

Wann werden in MySQL einfache Anführungszeichen, doppelte Anführungszeichen und Back-Ticks verwendet

Ich versuche zu lernen, wie man Abfragen am besten schreibt. Ich verstehe auch die Wichtigkeit, konsequent zu sein. Bis jetzt habe ich zufällig einzelne Anführungszeichen, doppelte Anführungszeichen und Back-Ticks verwendet, ohne wirklich darüber nachzudenken.

Beispiel:

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

Beachten Sie im obigen Beispiel auch, dass "table," "col[n]," and "val[n]" Variablen sein kann.

Was ist der Standard dafür? Wie geht's?

Ich habe ungefähr 20 Minuten lang Antworten auf ähnliche Fragen hier gelesen, aber es scheint, dass es keine endgültige Antwort auf diese Frage gibt.

546
Nate

Backticks sind für Tabellen- und Spaltenkennungen zu verwenden, sie sind jedoch nur erforderlich, wenn die Kennung ein MySQL Reserviertes Schlüsselwort ist oder wenn die Kennung Leerzeichen oder Zeichen außerhalb einer begrenzten Menge enthält (siehe unten). Dies wird häufig empfohlen Vermeiden Sie, wenn möglich, reservierte Schlüsselwörter als Spalten- oder Tabellenkennungen zu verwenden, und vermeiden Sie das Anführungszeichen.

Für String-Werte sollten einfache Anführungszeichen verwendet werden, wie in der Liste VALUES(). Doppelte Anführungszeichen werden von MySQL auch für Zeichenfolgenwerte unterstützt, aber einfache Anführungszeichen werden von anderen RDBMS allgemein akzeptiert. Es ist daher üblich, einfache Anführungszeichen anstelle von doppelten Anführungszeichen zu verwenden.

MySQL erwartet auch, dass DATE- und DATETIME-Literalwerte als Zeichenfolgen wie '2001-01-01 00:00:00' in Anführungszeichen gesetzt werden. Konsultieren Sie Date and Time Literals Dokumentation, um weitere Informationen zu erhalten, insbesondere Alternativen zur Verwendung des Bindestrichs - als Segmentbegrenzer in Datumszeichenfolgen.

In Ihrem Beispiel würde ich also die Zeichenfolge PHP in doppelte Anführungszeichen setzen und einfache Anführungszeichen für die Werte 'val1', 'val2' verwenden. NULL ist ein MySQL-Schlüsselwort und ein spezieller (nicht) -Wert und daher nicht in Anführungszeichen gesetzt.

Keine dieser Tabellen- oder Spaltenkennungen sind reservierte Wörter oder verwenden Zeichen, die Anführungszeichen erfordern, aber ich habe sie trotzdem mit Backticks zitiert (dazu später mehr ...).

Funktionen, die im RDBMS integriert sind (z. B. NOW() in MySQL), sollten nicht in Anführungszeichen gesetzt werden, obwohl ihre Argumente denselben bereits erwähnten String- oder Bezeichnerregeln unterliegen.

Backtick (`) 
 Tabelle & Spalte ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬─ ───┬──┬───────┐ 
 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 
 $ Query = "INSERT in `table` (` id`, `col1`,` col2`, `date`,` aktualisiert`) 
 WERTE (NULL, 'val1', 'val2', '2001-01-01', JETZT ())"; 
 ↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑ 
 Nicht zitiertes Schlüsselwort ─────┴┴┴┘ │ │ │ __ 
 Einzel- Anführungszeichen (') - Zeichenfolgen ───────────┴────┴──┴────┘ │ │││││ 
 Anführungszeichen (') DATUM Qu │││││ 
 Funktion ohne Anführungszeichen ──── ─────────────────────────────────────┴┴┴┴┘ 

Variable Interpolation

Die Zitiermuster für Variablen ändern sich nicht. Wenn Sie jedoch die Variablen direkt in einer Zeichenfolge interpolieren möchten, müssen diese in PHP in doppelte Anführungszeichen gesetzt werden. Stellen Sie nur sicher, dass Sie die Variablen für die Verwendung in SQL ordnungsgemäß maskiert haben. ( Es wird empfohlen, stattdessen eine API zu verwenden, die vorbereitete Anweisungen als Schutz gegen die SQL-Injection unterstützt ).

// Dasselbe gilt für einige Ersetzung von Variablen
// Hier ist der Name einer Variablentabelle $ $ backtick-quoted und die Variablen
// in der VALUES-Liste sind in einfachen Anführungszeichen "$ table"  ("id", "col1", "col2", "date")) WERTE (NULL, '$ val1''$ val2''$ date') "; 

Vorbereitete Anweisungen

Wenn Sie mit vorbereiteten Anweisungen arbeiten, lesen Sie in der Dokumentation nach, ob die Platzhalter der Anweisung angegeben werden müssen. Die populärsten APIs, die in PHP, PDO und MySQLi verfügbar sind, erwarten Platzhalter unquoted sowie die meisten vorbereiteten Anweisungs-APIs in anderen Sprachen:

// 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 (?, ?, ?, ?)";

Zeichen, die ein Backtick-Anführungszeichen in Bezeichnern erfordern:

Laut MySQL-Dokumentation müssen Sie keine Bezeichner (Backtick) mit folgendem Zeichensatz angeben:

ASCII: [0-9,a-z,A-Z$_] (lateinische Buchstaben, Ziffern 0-9, Dollar, Unterstrich)

Sie können Zeichen, die über diese Gruppe hinausgehen, als Tabellen- oder Spaltenbezeichner verwenden, z. B. Whitespace-Zeichen. Dann müssen Sie sie jedoch mit must ankreuzen.

536

Es gibt zwei Arten von Anführungszeichen in MySQL:

  1. ' zum Einschließen von String-Literalen
  2. ` zum Einschließen von Bezeichnern wie Tabellen- und Spaltennamen

Und dann gibt es ", was ein Sonderfall ist. Abhängig von sql_mode des MySQL-Servers kann dies für one der oben genannten Zwecke verwendet werden:

  1. Standardmäßig kann das Zeichen " verwendet werden, um Zeichenfolgenliterale wie ' einzuschließen.
  2. Im Modus ANSI_QUOTES kann das Zeichen " verwendet werden, um Bezeichner wie bei ` einzuschließen.

Die folgende Abfrage führt abhängig vom SQL-Modus zu unterschiedlichen Ergebnissen (oder Fehlern):

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

ANSI_QUOTES deaktiviert

Die Abfrage wählt das String-Literal "column" aus, wobei Spalte foo dem String "bar" entspricht.

ANSI_QUOTES aktiviert

Die Abfrage wählt die Spalte column aus, wobei Spalte foo der Spalte bar entspricht.

Wann was verwenden?

  • Ich empfehle Ihnen, " zu vermeiden, damit Ihr Code unabhängig von SQL-Modi wird
  • Verwenden Sie immer Bezeichner, da dies eine bewährte Methode ist (einige Fragen zu SO erörtern dies)
105
Salman A

(Es gibt gute Antworten bezüglich des SQL-Charakters Ihrer Frage, aber dies kann auch relevant sein, wenn Sie noch nicht mit PHP vertraut sind.)

Vielleicht ist es wichtig zu erwähnen, dass PHP einzelne und doppelte Anführungszeichen-Strings unterschiedlich behandelt ...

Strings mit einem einfachen Anführungsstrich sind „Literale“ und sind so ziemlich WYSIWYG-Strings. Strings in doppelten Anführungszeichen werden von PHP für eine mögliche Variablensubstitution interpretiert (Backticks in PHP sind nicht genau Strings; sie führen einen Befehl in der Shell aus und geben das Ergebnis zurück).

Beispiele:

$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
29
Chris Trahey

Backticks werden in der Regel dazu verwendet, eine identifier anzuzeigen und safe vor versehentlicher Verwendung der Reserved Keywords zu schützen. 

Zum Beispiel:

Use `database`;

Hier helfen die Backticks dem Server zu verstehen, dass database tatsächlich der Name der Datenbank und nicht die Datenbankkennung ist.

Gleiches gilt für die Tabellennamen und Feldnamen. Dies ist eine sehr gute Angewohnheit, wenn Sie Ihre Datenbankkennung mit Backticks umschließen.

Check this answer, um mehr über Backticks zu erfahren.


Nun zu Double Quotes & Single Quotes (Michael hat das schon erwähnt).

Um einen Wert zu definieren, müssen Sie jedoch einfache oder doppelte Anführungszeichen verwenden. Sehen wir uns ein anderes Beispiel an.

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

Hier habe ich bewusst vergessen, den title1 in Anführungszeichen zu packen. Nun nimmt der Server den title1 als Spaltennamen (d. H. Als Bezeichner) an. Um anzuzeigen, dass es sich um einen Wert handelt, müssen Sie entweder doppelte oder einfache Anführungszeichen verwenden.

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

In Kombination mit PHP erleichtern nun doppelte Anführungszeichen und einfache Anführungszeichen das Schreiben von Abfragen erheblich. Lassen Sie uns eine geänderte Version der Abfrage in Ihrer Frage sehen.

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

Wenn Sie nun doppelte Anführungszeichen in PHP verwenden, müssen Sie die Variablen $val1 und $val2 so verwenden, dass deren Werte verwendet werden. Dadurch wird eine vollständig gültige Abfrage erstellt. Mögen

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

wird machen

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

In MySQL werden diese Symbole verwendet, um eine Abfrage `, ", ' und () zu begrenzen.

  1. " oder ' werden zum Einschließen von stringähnlichen Werten "26-01-2014 00:00:00" oder '26-01-2014 00:00:00' verwendet. Diese Symbole gelten nur für Zeichenfolgen und nicht für Aggregatfunktionen wie now, sum oder max.

  2. ` wird zum Einschließen von Tabellen- oder Spaltennamen verwendet, z. select `column_name` from `table_name` where id='2'

  3. ( und ) schließen einfach Teile einer Abfrage ein, z. select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'.

12
Kumar Rakesh

Die String-Literale in MySQL und PHP sind identisch.

Eine Zeichenfolge ist eine Folge von Bytes oder Zeichen, die entweder in .__ eingeschlossen sind. einfache Anführungszeichen ("'") oder doppelte Anführungszeichen ("" ").

Wenn Ihre Zeichenfolge also einfache Anführungszeichen enthält, können Sie doppelte Anführungszeichen verwenden, um die Zeichenfolge in Anführungszeichen zu setzen, oder wenn sie doppelte Anführungszeichen enthält, könnten Sie einfache Anführungszeichen verwenden, um die Zeichenfolge in Anführungszeichen zu setzen. Wenn Ihre Zeichenfolge sowohl einfache Anführungszeichen als auch doppelte Anführungszeichen enthält, müssen Sie das Zeichen in Anführungszeichen setzen, in dem die Zeichenfolge verwendet wurde.

Meistens verwenden wir einfache Anführungszeichen für einen SQL-String-Wert. Daher müssen wir für einen PHP - String doppelte Anführungszeichen verwenden.

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

Und Sie könnten eine Variable in der doppelten Anführungszeichenfolge von PHP verwenden:

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

Wenn jedoch $val1 oder $val2 einfache Anführungszeichen enthält, führt dies dazu, dass Ihre SQL falsch ist. Daher müssen Sie es entkommen, bevor es in SQL verwendet wird. dafür ist mysql_real_escape_string. (Obwohl eine vorbereitete Aussage besser ist.)

11
xdazz

In Kombination von PHP und MySQL erleichtern doppelte Anführungszeichen und einfache Anführungszeichen die Abfragezeit beim Schreiben. 

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

Angenommen, Sie verwenden eine direkte post-Variable in die MySQL-Abfrage. Verwenden Sie diese Methode folgendermaßen:

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

Dies ist die bewährte Methode für die Verwendung von PHP - Variablen in MySQL.

10
vipul sorathiya

Wenn Tabellenspalten und -werte Variablen sind, gibt es zwei Möglichkeiten:

Bei doppelten Anführungszeichen "" die vollständige Abfrage:

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

Oder

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

Mit einfachen Anführungszeichen '':

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

Verwenden Sie die Rückstriche ``, wenn ein Spalten-/Wertname einem reservierten MySQL-Schlüsselwort ähnelt.

Hinweis: Wenn Sie einen Spaltennamen mit einem Tabellennamen bezeichnen, verwenden Sie hintere Häkchen wie folgt:

`table_name`. `column_name` <- Hinweis: . von den rückwärtigen Ticks ausschließen.

9
diEcho

Hier gab es viele hilfreiche Antworten, die in der Regel in zwei Punkte münden.

  1. BACKTICKS (`) werden für Bezeichnernamen verwendet.
  2. SINGLE QUOTES (') werden um Werte herum verwendet. 

UND wie @MichaelBerkowski sagte

Backticks werden für Tabellen- und Spaltenbezeichner verwendet, sind jedoch nur erforderlich, wenn der Bezeichner ein reserviertes MySQL-Schlüsselwort oder .__ ist. wenn der Bezeichner Leerzeichen oder Zeichen enthält jenseits einer begrenzten Menge (siehe unten) Es wird häufig empfohlen, .__ zu vermeiden. Verwendung von reservierten Schlüsselwörtern als Spalten- oder Tabellenkennungen, Vermeiden des Zitierens.

Es gibt jedoch einen Fall, in dem ein Bezeichner weder ein reserved-Schlüsselwort sein darf noch whitespace - oder -Zeichen jenseits der begrenzten Menge enthalten kann, jedoch zwingend Backticks erforderlich ist.

BEISPIEL

123E10 ist ein gültiger Bezeichnername, aber auch ein gültiges INTEGER-Literal.

[Ohne näher darauf einzugehen, wie Sie einen solchen Bezeichnernamen erhalten würden], Angenommen, ich möchte eine temporäre Tabelle mit dem Namen 123456e6 erstellen.

Kein Fehler bei Backticks.

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

ERROR, wenn keine Backticks verwendet werden.

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

123451a6 ist jedoch ein perfekter Bezeichnername (ohne Rückschritt).

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

Dies ist vollständig, weil 1234156e6 auch eine Exponentialnummer ist.

9
user5574289

Für String-Werte sollten einfache Anführungszeichen verwendet werden, wie in der Liste VALUES ().

Backticks werden in der Regel dazu verwendet, einen Bezeichner anzugeben und vor versehentlicher Verwendung der reservierten Schlüsselwörter zu schützen.

In Kombination von PHP und MySQL erleichtern doppelte Anführungszeichen und einfache Anführungszeichen das Schreiben von Abfragen erheblich.

7
john igneel

Abgesehen von den (gut erklärten) Antworten wurde das Folgende nicht erwähnt und ich besuche dieses Q & A häufig.

In einer Nussschale; MySQL möchte, dass Sie math in einer eigenen Tabelle/Spalte ausführen möchten, und interpretiert Bindestriche wie "E-Mail" als e minus mail


Haftungsausschluss: Also dachte ich, ich würde dies als "FYI" -Antwort für diejenigen hinzufügen, die mit der Arbeit mit Datenbanken völlig neu sind und die beschriebenen technischen Begriffe möglicherweise nicht verstehen.

2

SQL-Server und MySQL, PostgreySQL und Oracle verstehen keine doppelten Anführungszeichen ("). Daher sollte Ihre Abfrage keine doppelten Anführungszeichen (") enthalten und nur einfache Anführungszeichen (') verwenden.

Back-trip (`) ist optional für die Verwendung in SQL und wird für Tabellennamen, Datenbanknamen und Spaltennamen verwendet.

Wenn Sie versuchen, eine Abfrage in Ihr Backend zu schreiben, um MySQL aufzurufen, können Sie doppelte Anführungszeichen (") oder einfache Anführungszeichen (') verwenden, um die Abfrage einer Variablen zuzuordnen.

let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';

Wenn es eine where-Anweisung in Ihrer Abfrage gibt und/oder versucht, insert einen Wert und/oder eine update-Wert zu verwenden, die string ist, verwenden Sie für diese Werte ein einfaches Anführungszeichen ('):

let querySelect = "select id, name from accounts where name = 'John'";
let queryUpdate = "update accounts set name = 'John' where id = 8";
let queryInsert = "insert into accounts(name) values('John')";

//Please not that double quotes are only to be used in assigning string to our variable not in the query
//All these below will generate error

let querySelect = 'select id, name from accounts where name = "John"';
let queryUpdate = 'update accounts set name = "John" where id = 8';
let queryInsert = 'insert into accounts(name) values("John")';

//As MySQL or any SQL doesn't understand double quotes("), these all will generate error.

Wenn Sie sich aus dieser Verwirrung heraushalten möchten, wenn Sie doppelte Anführungszeichen (") und einfache Anführungszeichen (') verwenden, empfiehlt es sich, bei einfachen Anführungszeichen (') zu bleiben. Dazu gehören beispielsweise backslash ():

let query = 'select is, name from accounts where name = \'John\'';

Probleme mit doppelten (") oder einfachen (') Anführungszeichen treten auf, wenn wir einen dynamischen Wert zuweisen und eine String-Verkettung durchführen müssen, wie:

let query = "select id, name from accounts where name = " + fName + " " + lName;
//This will generate error as it must be like name = 'John Smith' for SQL
//However our statement made it like name = John Smith

//In order to resolve such errors use
let query = "select id, name from accounts where name = '" + fName + " " + lName + "'";

//Or using backslash(\)
let query = 'select id, name from accounts where name = \'' + fName + ' ' + lName + '\'';

Wenn Sie weitere Freigabe benötigen, folgen Sie Zitate in JavaScript

0
NAVIN