Mysql
 sql >> Datenbank >  >> RDS >> Mysql

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

Backticks sind für Tabellen- und Spaltenbezeichner zu verwenden, sind aber nur notwendig, wenn der Bezeichner ein MySQL-reserviertes Schlüsselwort , oder wenn der Bezeichner Leerzeichen oder Zeichen enthält, die über einen begrenzten Satz hinausgehen (siehe unten). Es wird oft empfohlen, reservierte Schlüsselwörter möglichst nicht als Spalten- oder Tabellenbezeichner zu verwenden, um das Problem der Anführungszeichen zu vermeiden.

Einfache Anführungszeichen sollten für Zeichenfolgenwerte wie in VALUES() verwendet werden aufführen. Doppelte Anführungszeichen werden von MySQL auch für Zeichenfolgenwerte unterstützt, aber einfache Anführungszeichen werden von anderen RDBMS weiter akzeptiert, daher ist es eine gute Angewohnheit, einfache Anführungszeichen anstelle von doppelten zu verwenden.

MySQL erwartet auch DATE und DATETIME Literale Werte müssen als Zeichenfolgen in einfache Anführungszeichen gesetzt werden, z. B. '2001-01-01 00:00:00' . Konsultieren Sie die Datums- und Zeitliterale Dokumentation für weitere Details, insbesondere Alternativen zur Verwendung des Bindestrichs - als Segmenttrennzeichen in Datumszeichenfolgen.

Wenn ich also Ihr Beispiel verwende, würde ich den PHP-String 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 wird daher nicht in Anführungszeichen gesetzt.

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

Native Funktionen des RDBMS (z. B. NOW() in MySQL) sollten nicht in Anführungszeichen gesetzt werden, obwohl ihre Argumente den gleichen bereits erwähnten Regeln für das Zitieren von Zeichenfolgen oder Bezeichnern unterliegen.

Backtick (`)
table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐
                      ↓     ↓  ↓  ↓  ↓    ↓  ↓    ↓  ↓    ↓  ↓       ↓
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) 
                       VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())";
                               ↑↑↑↑  ↑    ↑  ↑    ↑  ↑          ↑  ↑↑↑↑↑ 
Unquoted keyword          ─────┴┴┴┘  │    │  │    │  │          │  │││││
Single-quoted (') strings ───────────┴────┴──┴────┘  │          │  │││││
Single-quoted (') DATE    ───────────────────────────┴──────────┘  │││││
Unquoted function         ─────────────────────────────────────────┴┴┴┴┘    

Variableninterpolation

Die Anführungsmuster für Variablen ändern sich nicht, wenn Sie jedoch beabsichtigen, die Variablen direkt in einen String zu interpolieren, muss dieser in PHP in doppelte Anführungszeichen gesetzt werden. Stellen Sie nur sicher, dass Sie die Variablen für die Verwendung in SQL richtig maskiert haben. (Es wird empfohlen, eine API zu verwenden, die vorbereitete Anweisungen unterstützt stattdessen als Schutz vor SQL-Injection ).

// Same thing with some variable replacements
// Here, a variable table name $table is backtick-quoted, and variables
// in the VALUES list are single-quoted 
$query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";

Vorbereitete Erklärungen

Wenn Sie mit vorbereiteten Anweisungen arbeiten, sehen Sie in der Dokumentation nach, ob die Platzhalter der Anweisung in Anführungszeichen gesetzt werden müssen oder nicht. Die beliebtesten APIs, die in PHP, PDO und MySQLi verfügbar sind, erwarten unquoted Platzhalter, wie dies bei den meisten vorbereiteten Anweisungs-APIs in anderen Sprachen der Fall ist:

// 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 Backtick-Anführungszeichen in Bezeichnern erfordern:

Gemäß MySQL-Dokumentation , müssen Sie Bezeichner mit dem folgenden Zeichensatz nicht in Anführungszeichen setzen:

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

Sie können Zeichen außerhalb dieses Satzes als Tabellen- oder Spaltenbezeichner verwenden, einschließlich beispielsweise Leerzeichen, aber dann müssen zitiere sie (Backtick).

Auch wenn Zahlen gültige Zeichen für Bezeichner sind, können Bezeichner nicht nur aus Zahlen bestehen. Wenn sie das tun, müssen sie in Backticks gewickelt werden.