Les backticks doivent être utilisés pour les identificateurs de table et de colonne, mais ne sont nécessaires que lorsque l'identifiant est un mot clé réservé MySQL , ou lorsque l'identifiant contient des espaces ou des caractères au-delà d'un ensemble limité (voir ci-dessous). Il est souvent recommandé d'éviter d'utiliser des mots clés réservés comme identificateurs de colonne ou de table lorsque cela est possible, en évitant le problème de citation.
Des guillemets simples doivent être utilisés pour les valeurs de chaîne comme dans la VALUES()
liste. Les guillemets doubles sont également pris en charge par MySQL pour les valeurs de chaîne, mais les guillemets simples sont plus largement acceptés par les autres SGBDR, c'est donc une bonne habitude d'utiliser des guillemets simples au lieu de doubles.
MySQL s'attend également à ce DATE
que DATETIME
les valeurs littérales soient entre guillemets simples comme des chaînes '2001-01-01 00:00:00'
. Consultez la documentation des littéraux de date et d'heure pour plus de détails, en particulier des alternatives à l'utilisation du trait -
d' union comme délimiteur de segment dans les chaînes de date.
Donc, en utilisant votre exemple, je citerais deux fois la chaîne PHP et utiliserais des guillemets simples sur les valeurs 'val1', 'val2'
. NULL
est un mot-clé MySQL, et une valeur (non) spéciale, et n'est donc pas cité.
Aucun de ces identifiants de table ou de colonne n'est un mot réservé ou n'utilise des caractères nécessitant une citation, mais je les ai quand même cités avec des astuces (plus de détails plus loin ...).
Les fonctions natives du SGBDR (par exemple, NOW()
dans MySQL) ne doivent pas être citées, bien que leurs arguments soient soumis aux mêmes règles de citation de chaîne ou d'identifiant déjà mentionnées.
Backtick (`)
table et colonne ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬ ───────┐
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = " INSERT INTO` table` (`id`,` col1`, `col2`,` date`, `updated`)
VALEURS (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑
Mot-clé non cité ─────┴┴┴┘ │ │ │ │ │ │ │││││
Chaînes entre guillemets simples (') ───────────┴────┴──┴────┘ │ │ │││││
Devis simple (') DATE ───────────────────────────┴──────────┘ ││││ │
Fonction non citée ─────────────────────────────────────────┴┴┴┴┘
Interpolation variable
Les modèles de guillemets pour les variables ne changent pas, bien que si vous avez l'intention d'interpoler les variables directement dans une chaîne, ils doivent être entre guillemets doubles en PHP. Assurez-vous simplement que vous avez correctement échappé les variables à utiliser dans SQL. ( Il est recommandé d'utiliser à la place une API prenant en charge les instructions préparées, comme protection contre l'injection SQL ).
// Même chose avec certains remplacements de variables
// Ici, un nom de table de variable $ table est entre guillemets, et les variables
// dans la liste VALUES sont entre guillemets simples
$ query = "INSERT INTO` $ table` (`id`,` col1`, `col2`,` date`) VALUES (NULL, '$ val1' , '$ val2' , '$ date' ) ";
Déclarations préparées
Lorsque vous travaillez avec des instructions préparées, consultez la documentation pour déterminer si les espaces réservés de l'instruction doivent être cités. Les API les plus populaires disponibles en PHP, PDO et MySQLi, attendent des espaces réservés non cités, comme le font la plupart des API d'instructions préparées dans d'autres langues:
// 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 (?, ?, ?, ?)";
Caractères nécessitant un backtick entre guillemets:
Selon la documentation MySQL , vous n'avez pas besoin de citer (backtick) les identifiants en utilisant le jeu de caractères suivant:
ASCII: [0-9,a-z,A-Z$_]
(lettres latines de base, chiffres 0-9, dollar, trait de soulignement)
Vous pouvez utiliser des caractères au-delà de cet ensemble comme identifiants de table ou de colonne, y compris les espaces blancs par exemple, mais vous devez ensuite les citer (les insérer).
"tablename"
, et les guillemets simples sont pour les littéraux, par exemple'this is a some text'
. Les back-ticks ne sont jamais utilisés en SQL standard. (Si vous devez inclure un guillemet double dans un identifiant, tapez-le deux fois comme"odd""tablename"
. De même, double guillemets simples dans des littéraux, comme'Conan O''Brien'
.)