I backtick devono essere utilizzati per identificatori di tabelle e colonne, ma sono necessari solo quando l'identificatore è una parola chiave riservata MySQL o quando l'identificatore contiene caratteri di spazi bianchi o caratteri oltre un set limitato (vedere di seguito) Si consiglia spesso di evitare l'uso di parole chiave riservate come identificatori di colonne o tabelle quando possibile, evitando il problema di quotazione.
Le virgolette singole dovrebbero essere utilizzate per i valori di stringa come VALUES()
nell'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 utilizzare virgolette singole anziché doppie.
MySQL anche aspetta DATE
e DATETIME
valori letterali di essere single-citato come stringhe come '2001-01-01 00:00:00'
. Consultare la documentazione letterali di data e ora per maggiori dettagli, in particolare le alternative all'uso del trattino -
come delimitatore di segmento nelle stringhe di date.
Quindi, usando il tuo esempio, citerei due volte la stringa PHP e userei virgolette singole sui valori 'val1', 'val2'
. NULL
è una parola chiave MySQL e un valore speciale (non), quindi non quotato.
Nessuno di questi identificatori di tabelle o colonne sono parole riservate o fanno uso di caratteri che richiedono una citazione, ma li ho comunque citati con i backtick (ne parleremo più avanti ...).
Le funzioni native di RDBMS (ad esempio, NOW()
in MySQL) non devono essere citate, sebbene i loro argomenti siano soggetti alla stessa stringa o identificatore delle regole di quotazione già menzionate.
Backtick (`)
tabella e colonna ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬─────┬──┬ ───────┐
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = " INSERISCI IN` table` (`id`,` col1`, `col2`,` date`, `updated`)
VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑
Parola chiave non quotata ─────┴┴┴┘ │ │ │ │ │ │ │││││
Stringhe a virgoletta singola (') ───────────┴────┴──┴────┘ │ │ │││││
DATA (') a virgoletta singola ────────────────────────────┴───────────┘ ││││ │
Funzione non quotata ───────────────────────────────────────────┴┴┴┴┘
Interpolazione variabile
I modelli di quotazione per le variabili non cambiano, anche se se si intende interpolare le variabili direttamente in una stringa, è necessario che siano doppie virgolette in PHP. Assicurati solo di essere sfuggito correttamente alle variabili per l'uso in SQL. ( Si consiglia invece di utilizzare un'API che supporti le istruzioni preparate, come protezione contro l'iniezione SQL ).
// Stessa cosa con alcune sostituzioni variabili
// In questo caso, il nome di una tabella $ table viene quotato a rovescio e variabili
// nell'elenco VALORI sono a virgoletta singola
$ query = "INSERISCI IN` $ table` (`id`,` col1`, `col2`,` date`) VALUES (NULL, '$ val1' , '$ val2' , '$ date' ) ";
Dichiarazioni preparate
Quando si lavora con dichiarazioni preparate, consultare la documentazione per determinare se i segnaposto della dichiarazione devono essere quotati o meno. Le API più popolari disponibili in PHP, DOP e MySQLi si aspettano segnaposti non quotati, così come le API delle dichiarazioni più 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 il backtick tra virgolette negli identificatori:
Secondo la documentazione di MySQL , non è necessario citare gli identificativi (backtick) utilizzando il seguente set di caratteri:
ASCII: [0-9,a-z,A-Z$_]
(lettere latine di base, cifre 0-9, dollaro, trattino basso)
È possibile utilizzare caratteri oltre quell'insieme come identificatori di tabella o colonna, incluso ad esempio spazi bianchi, ma è necessario citarli (backtick).
"tablename"
. E le virgolette singole sono per letterali, ad es'this is a some text'
. I segni di spunta non vengono mai utilizzati in SQL standard. (Se è necessario includere una doppia virgoletta in un identificatore, digitarla due volte come"odd""tablename"
. Allo stesso modo, raddoppiare le virgolette singole in letterali, come'Conan O''Brien'
.)