Wann werden einfache Anführungszeichen, doppelte Anführungszeichen und Backticks in MySQL verwendet?

632

Ich versuche zu lernen, wie man Abfragen am besten schreibt. Ich verstehe auch, wie wichtig es ist, konsequent zu sein. Bis jetzt habe ich zufällig einfache Anführungszeichen, doppelte Anführungszeichen und Backticks verwendet, ohne wirklich darüber nachzudenken.

Beispiel:

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

Auch in dem obigen Beispiel der Meinung , dass table, col1, val1usw. können Variablen sein.

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

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

Nate
quelle
16
Beachten Sie, dass dies eine sehr MySQL-spezifische Frage ist. SQL im Allgemeinen (dh ISO / ANSI SQL) hat einen anderen Satz von Anführungszeichen: Doppelte Anführungszeichen stehen für begrenzte Bezeichner, z. B. "tablename"und einfache Anführungszeichen für Literale, z 'this is a some text'. Back-Ticks werden in Standard-SQL niemals verwendet. (Wenn Sie ein doppeltes Anführungszeichen in einen Bezeichner "odd""tablename"'Conan O''Brien'
einfügen müssen

Antworten:

608

Backticks sind für Tabellen- und Spaltenkennungen zu verwenden, sind jedoch nur erforderlich, wenn die Kennung ein reserviertes MySQL-Schlüsselwort ist oder wenn die Kennung Leerzeichen oder Zeichen enthält, die über einen begrenzten Satz hinausgehen (siehe unten). Es wird häufig empfohlen, die Verwendung reservierter Schlüsselwörter zu vermeiden wenn möglich als Spalten- oder Tabellenkennungen, um das Angebotsproblem zu vermeiden.

Für Zeichenfolgenwerte wie in der VALUES()Liste sollten einfache Anführungszeichen verwendet werden . Doppelte Anführungszeichen werden von MySQL auch für Zeichenfolgenwerte unterstützt, aber einfache Anführungszeichen werden von anderen RDBMS häufiger akzeptiert. Daher ist es eine gute Angewohnheit, einfache Anführungszeichen anstelle von doppelten Anführungszeichen zu verwenden.

MySQL erwartet auch , DATEund DATETIMELiteralwerte wie einfache Anführungszeichen als Zeichenfolge zu sein '2001-01-01 00:00:00'. Konsultieren Sie Datum und Uhrzeit Literale Dokumentation für weitere Details, insbesondere Alternativen zu dem Bindestrich verwendet -als Segmenttrennzeichen in Datumsstrings.

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

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

Funktionen, die dem RDBMS eigen sind (z. B. NOW()in MySQL), sollten nicht in Anführungszeichen gesetzt werden, obwohl ihre Argumente denselben Zeichenfolgen- oder Bezeichner-Anführungsregeln unterliegen, die bereits erwähnt wurden.

Backtick (`)
Tabelle & Spalte ──────────────────────────────────────────────┬ ───────┐
                      ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = " INSERT IN` table` (`id`,` col1`, `col2`,` date`, `aktualisiert`)
                       VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
                               ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 
Nicht zitiertes Schlüsselwort ─────┴┴┴┘ │ │ │ │ │ │ │
Einfache Anführungszeichen (') ─────────────────────────┘ ┘┘││││││ │ │ │││││
Einfach zitiert (') DATUM ───────────────────────────────────────── │
Nicht zitierte Funktion ────────────────────────────────────────────    

Variable Interpolation

Die Anführungszeichen für Variablen ändern sich nicht. Wenn Sie die Variablen jedoch direkt in einer Zeichenfolge interpolieren möchten, müssen sie in PHP in doppelte Anführungszeichen gesetzt werden. Stellen Sie einfach 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 unterstützt, um sich vor SQL-Injection zu schützen .)

// Gleiches gilt für einige Variablenersetzungen
// Hier wird ein Variablentabellenname $ table mit Backtick-Anführungszeichen und Variablen angegeben
// in der Liste VALUES stehen in einfachen Anführungszeichen 
$ query = "INSERT IN` $ table` (`id`,` col1`, `col2`,` date`) VALUES (NULL, '$ val1' , '$ val2' , '$ date' ) ";

Vorbereitete Aussagen

Wenn Sie mit vorbereiteten Aussagen arbeiten, konsultieren Sie die Dokumentation, um festzustellen, ob die Platzhalter der Aussage in Anführungszeichen gesetzt werden müssen oder nicht. Die beliebtesten APIs in PHP, PDO und MySQLi erwarten nicht zitierte Platzhalter, ebenso wie 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, bei denen ein Backtick in Bezeichnern angegeben werden muss:

Gemäß der MySQL-Dokumentation müssen Sie keine Bezeichner (Backtick) mit dem folgenden Zeichensatz in Anführungszeichen setzen:

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

Sie können Zeichen, die über diesen Satz hinausgehen, als Tabellen- oder Spaltenbezeichner verwenden, einschließlich Leerzeichen, aber dann müssen Sie sie in Anführungszeichen setzen (Backtick).

Michael Berkowski
quelle
43
" Aber einfache Anführungszeichen werden von anderen RDBMS allgemein akzeptiert " - die Verwendung von einfachen Anführungszeichen für Zeichenfolgenliterale wird vom SQL-Standard definiert (und erforderlich)
a_horse_with_no_name
@a_horse_with_no_name fast niemand benutzt ANSI MySQL ('|' für String Concat - wirklich?)
Good Person
3
Dies ist nicht wahr: "MySQL erwartet auch, dass DATE- und DATETIME-Literalwerte als Zeichenfolgen wie '2001-01-01 00:00:00' in
einfache
3
@evilReiko MySQL-Dokumente scheinen Alias-Zitate nicht eindeutig zu adressieren. Es werden Einzel-, Doppel- oder Backticks für Aliase akzeptiert, dies kann jedoch durch verschiedene ANSI-SQL-Modi beeinflusst werden. Ich bin mir nicht sicher, was die SQL-Spezifikation für Alias-Anführungszeichen erfordert - Persönliche Präferenz: Aus Gründen der Konsistenz zitiere ich sie genauso wie Spaltenbezeichner - das heißt, ich klicke sie entweder bei Bedarf zurück oder lasse sie ohne Anführungszeichen, wenn nicht. Ich verwende keine einfachen oder doppelten Anführungszeichen für Aliase.
Michael Berkowski
2
@ GuneyOzsan Ja, sehr verletzlich. Verwenden Sie niemals eine Variable für einen Tabellennamen, es sei denn, sie wurde anhand einer Liste akzeptabler Tabellennamen validiert. Erstellen Sie ein Array zulässiger Namen und überprüfen Sie, ob die Variable mit etwas in der Liste übereinstimmt, um die Verwendung sicher zu machen. Andernfalls können Sie eine Tabellennamenvariable nicht sicher für die Verwendung maskieren.
Michael Berkowski
121

In MySQL gibt es zwei Arten von Anführungszeichen:

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

Und dann "ist da noch ein Sonderfall. Abhängig von den MySQL-Servern kann es jeweils für einen der oben genannten Zwecke verwendet werden sql_mode:

  1. Standardmäßig kann das "Zeichen verwendet werden, um Zeichenfolgenliterale wie folgt einzuschließen'
  2. Im ANSI_QUOTESModus kann das "Zeichen verwendet werden, um Bezeichner genau wie einzuschließen`

Die folgende Abfrage führt je nach SQL-Modus zu unterschiedlichen Ergebnissen (oder Fehlern):

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

ANSI_QUOTES deaktiviert

Die Abfrage wählt das Zeichenfolgenliteral aus, "column"wobei die Spalte fooder Zeichenfolge entspricht"bar"

ANSI_QUOTES aktiviert

Die Abfrage wählt die Spalte aus, columnin der die Spalte fooder Spalte entsprichtbar

Wann was zu verwenden

  • Ich schlage vor, dass Sie die Verwendung vermeiden, "damit Ihr Code unabhängig von den SQL-Modi wird
  • Zitieren Sie immer Bezeichner, da dies eine gute Vorgehensweise ist (einige Fragen zu SO diskutieren dies).
Salman A.
quelle
32

(Es gibt oben gute Antworten bezüglich der SQL-Natur Ihrer Frage, aber dies kann auch relevant sein, wenn Sie neu in PHP sind.)

Vielleicht ist es wichtig zu erwähnen, dass PHP Zeichenfolgen in einfachen und doppelten Anführungszeichen unterschiedlich behandelt ...

Zeichenfolgen in einfachen Anführungszeichen sind "Literale" und so ziemlich WYSIWYG-Zeichenfolgen. Zeichenfolgen in doppelten Anführungszeichen werden von PHP für eine mögliche Variablensubstitution interpretiert (Backticks in PHP sind nicht genau Zeichenfolgen; 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
Chris Trahey
quelle
23

Backticks werden im Allgemeinen verwendet, um die reservierten Schlüsselwörter anzuzeigen identifierund vor versehentlicher Verwendung zu schützen .

Zum Beispiel:

Use `database`;

Hier helfen die Backticks dem Server zu verstehen, dass dies databasetatsächlich der Name der Datenbank ist, nicht die Datenbankkennung.

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

Überprüfen Sie diese Antwort, um mehr über Backticks zu erfahren.


Nun zu doppelten Anführungszeichen und einfachen Anführungszeichen (Michael hat das bereits erwähnt).

Um einen Wert zu definieren, müssen Sie jedoch entweder 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, das title1mit Anführungszeichen zu versehen. Jetzt nimmt der Server den title1als Spaltennamen (dh einen Bezeichner). 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 doppelte und einfache Anführungszeichen das Schreiben von Abfragen erheblich. Sehen wir uns eine modifizierte Version der Abfrage in Ihrer Frage an.

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

Jetzt verwenden Sie doppelte Anführungszeichen in PHP, um die Variablen zu erstellen $val1und $val2ihre Werte zu verwenden, wodurch eine perfekt gültige Abfrage erstellt wird. 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')
Starx
quelle
15

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

  1. "oder 'werden zum Einschließen von stringartigen Werten "26-01-2014 00:00:00"oder verwendet '26-01-2014 00:00:00'. Diese Symbole sind nur für Streicher, keine Aggregatfunktionen wie now, sumoder max.

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

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

Kumar Rakesh
quelle
13

Die String-Literale in MySQL und PHP sind identisch.

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

Wenn Ihre Zeichenfolge einfache Anführungszeichen enthält, können Sie die Zeichenfolge in doppelte Anführungszeichen setzen, oder wenn sie doppelte Anführungszeichen enthält, können Sie die Zeichenfolge in einfache Anführungszeichen setzen. Wenn Ihre Zeichenfolge jedoch sowohl einfache als auch doppelte Anführungszeichen enthält, müssen Sie die Zeichenfolge umgehen, mit der die Zeichenfolge in Anführungszeichen gesetzt wurde.

Meistens verwenden wir einfache Anführungszeichen für einen SQL-Zeichenfolgenwert, daher müssen wir doppelte Anführungszeichen für eine PHP-Zeichenfolge 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')";

Aber wenn $val1oder $val2einfache Anführungszeichen enthält, wird Ihre SQL falsch sein. Sie müssen es also maskieren, bevor es in SQL verwendet wird. dafür ist mysql_real_escape_stringes da. (Obwohl eine vorbereitete Aussage besser ist.)

xdazz
quelle
12

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

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

Angenommen, Sie verwenden eine direkte Post-Variable in der MySQL-Abfrage. Verwenden Sie sie dann folgendermaßen:

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

Dies ist die beste Vorgehensweise für die Verwendung von PHP-Variablen in MySQL.

vipul sorathiya
quelle
Daher sind doppelte Anführungszeichen flexibel, können jedoch nicht als Bezeichner verwendet werden.
Rhavendc
Bitte verwenden Sie niemals direkt uneingeschränkte Benutzereingaben in Ihrer Anfrage!
Jankal
@jankal Es ist nur ein Beispiel. Ich habe angegeben, dass, wenn Sie direkte Benutzereingaben verwenden, dann n dann ...........
vipul sorathiya
@vipulsorathiya Bitte geben Sie in Ihrer Antwort an, dass POST-Variablen maskiert werden sollen. Sie zeigen jetzt darauf, sie direkt in Ihrer Abfrage zu verwenden. Schlecht für Anfänger, die dies versuchen ...
RFLdev
12

Hier gab es viele hilfreiche Antworten, die im Allgemeinen in zwei Punkten gipfelten.

  1. BACKTICKS (`) werden um Bezeichnernamen verwendet.
  2. SINGLE QUOTES (') werden um Werte verwendet.

UND wie @MichaelBerkowski sagte

Backticks sind für Tabellen- und Spaltenkennungen zu verwenden, sind jedoch nur erforderlich, wenn die Kennung ein MySQLreserviertes Schlüsselwort ist oder wenn die Kennung Leerzeichen oder Zeichen enthält, die über einen begrenzten Satz hinausgehen (siehe unten). Es wird häufig empfohlen, die Verwendung reservierter Schlüsselwörter als zu vermeiden Spalten- oder Tabellenkennungen, wenn möglich, um das Angebotsproblem zu vermeiden.

Es gibt jedoch einen Fall, in dem ein Bezeichner weder ein reserviertes Schlüsselwort sein kann noch Leerzeichen oder Zeichen enthält, die über einen begrenzten Satz hinausgehen, sondern notwendigerweise Backticks erfordern.

BEISPIEL

123E10ist ein gültiger Bezeichnername, aber auch ein gültiges INTEGERLiteral.

[Ohne ins Detail zu gehen, wie Sie einen solchen Bezeichnernamen erhalten würden] Angenommen, ich möchte eine temporäre Tabelle mit dem Namen erstellen 123456e6.

Kein Fehler bei Backticks.

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

FEHLER, 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

Es handelt sich jedoch 123451a6um einen vollkommen feinen Bezeichnernamen (ohne hintere Häkchen).

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

Dies liegt vollständig daran, dass 1234156e6es sich auch um eine Exponentialzahl handelt.

MJ007
quelle
10

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

Mit 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 Back-Ticks, ``wenn ein Spalten- / Wertname einem reservierten MySQL-Schlüsselwort ähnelt.

Hinweis: Wenn Sie einen Spaltennamen mit einem Tabellennamen kennzeichnen, verwenden Sie folgende Back Ticks:

`table_name`. `column_name` <- Hinweis: . Von Back Ticks ausschließen.

diEcho
quelle
8

Einfache Anführungszeichen sollten für Zeichenfolgenwerte wie in der Liste VALUES () verwendet werden.

Backticks werden im Allgemeinen verwendet, um eine Kennung anzugeben und um sicher zu sein, dass die reservierten Schlüsselwörter nicht versehentlich verwendet werden.

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

John Igneel
quelle
3

Abgesehen von all den (gut erklärten) Antworten wurde Folgendes nicht erwähnt, und ich besuche diese Fragen und Antworten ziemlich oft.

In einer Nussschale; MySQL glaubt, dass Sie in einer eigenen Tabelle / Spalte rechnen möchten, und interpretiert Bindestriche wie "E-Mail" als e Minus mail .


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

Funk Forty Niner
quelle
1

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

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

Wenn Sie versuchen, eine Abfrage in Ihr Back-End zu schreiben, um MySQL aufzurufen, können Sie doppelte Anführungszeichen (") oder einfache Anführungszeichen (') verwenden, um einer Variablen eine Abfrage zuzuweisen, wie:

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

Wenn whereIhre Abfrage eine Anweisung enthält und / oder versucht, inserteinen Wert und / oder einen updateWert zu erhalten, bei dem es sich um eine Zeichenfolge handelt, verwenden Sie ein einfaches Anführungszeichen (') für diese Werte wie:

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 bei der Verwendung von doppelten Anführungszeichen (") und einfachen Anführungszeichen (') aus dieser Verwirrung heraushalten möchten, empfehlen wir, bei einfachen Anführungszeichen (') zu bleiben. Dies beinhaltet Backslash () wie:

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

Probleme mit doppelten (") oder einfachen (') Anführungszeichen treten auf, wenn wir einen Wert dynamisch zuweisen und eine Zeichenfolgenverkettung durchführen mussten, 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 Freigaben benötigen, befolgen Sie die Anführungszeichen in JavaScript

NAVIN
quelle