Mysql
 sql >> Database >  >> RDS >> Mysql

Quando utilizzare virgolette singole, virgolette doppie e backtick in MySQL

I backtick devono essere utilizzati per identificatori di tabelle e colonne, ma sono necessari solo quando l'identificatore è un Parola chiave riservata MySQL , o quando l'identificatore contiene spazi bianchi o caratteri oltre un insieme limitato (vedi sotto) Si consiglia spesso di evitare di utilizzare parole chiave riservate come identificatori di colonne o tabelle quando possibile, evitando il problema delle virgolette.

Le virgolette singole dovrebbero essere utilizzate per i valori di stringa come in VALUES() elenco. Le virgolette doppie sono supportate da MySQL anche per i valori di stringa, ma le virgolette singole sono più ampiamente accettate da altri RDBMS, quindi è una buona abitudine usare le virgolette singole anziché doppie.

MySQL si aspetta anche DATE e DATETIME valori letterali da inserire tra virgolette singole come stringhe come '2001-01-01 00:00:00' . Consulta i valori letterali di data e ora documentazione per maggiori dettagli, in particolare alternative all'uso del trattino - come delimitatore di segmento nelle stringhe di data.

Quindi, usando il tuo esempio, citerei tra virgolette la stringa PHP e userei virgolette singole sui valori 'val1', 'val2' . NULL è una parola chiave MySQL e un valore (non) speciale, pertanto non è tra virgolette.

Nessuno di questi identificatori di tabelle o colonne sono parole riservate o utilizzano caratteri che richiedono virgolette, ma li ho comunque citati con backtick (ne parleremo più avanti...).

Funzioni native dell'RDBMS (ad esempio, NOW() in MySQL) non devono essere citati, sebbene i loro argomenti siano soggetti alle stesse regole di citazione di stringhe o identificatori già menzionate.

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         ─────────────────────────────────────────┴┴┴┴┘    

Interpolazione variabili

I modelli di virgolette per le variabili non cambiano, anche se se si intende interpolare le variabili direttamente in una stringa, in PHP deve essere tra virgolette doppie. Assicurati solo di aver eseguito correttamente l'escape delle variabili per l'uso in SQL. (Si consiglia di utilizzare un'API che supporti le istruzioni preparate invece, come protezione contro 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')";

Dichiarazioni preparate

Quando si lavora con le dichiarazioni preparate, consultare la documentazione per determinare se i segnaposto delle dichiarazioni devono essere citati o meno. Le API più popolari disponibili in PHP, PDO e MySQLi si aspettano non quotate segnaposto, così come la maggior parte delle API di istruzioni preparate in altre lingue:

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

Caratteri che richiedono la citazione del backtick negli identificatori:

Secondo la documentazione MySQL , non è necessario citare gli identificatori (backtick) utilizzando il seguente set di caratteri:

ASCII:[0-9,a-z,A-Z$_] (lettere latine di base, cifre 0-9, dollaro, trattino basso)

Puoi utilizzare caratteri oltre a quelli impostati come identificatori di tabella o colonna, inclusi ad esempio gli spazi bianchi, ma poi devi citali (backtick).

Inoltre, sebbene i numeri siano caratteri validi per gli identificatori, gli identificatori non possono essere costituiti esclusivamente da numeri. Se lo fanno, devono essere avvolti in backtick.