Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quand utiliser des guillemets simples, des guillemets doubles et des backticks dans MySQL

Les backticks doivent être utilisés pour les identifiants 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 caractères d'espacement ou des caractères au-delà d'un ensemble limité (voir ci-dessous)

Les guillemets simples doivent être utilisés pour les valeurs de chaîne comme dans le 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 d'autres RDBMS, c'est donc une bonne habitude d'utiliser des guillemets simples au lieu de doubles.

MySQL attend également DATE et DATETIME les valeurs littérales doivent être entre guillemets simples sous forme de chaînes telles que '2001-01-01 00:00:00' . Consultez les littéraux de date et d'heure documentation pour plus de détails, en particulier les alternatives à l'utilisation du trait d'union - comme délimiteur de segment dans les chaînes de date.

Donc, en utilisant votre exemple, je mettrais entre guillemets la chaîne PHP et utiliserais des guillemets simples sur les valeurs 'val1', 'val2' . NULL est un mot-clé MySQL et une (non)-valeur spéciale, et n'est donc pas entre guillemets.

Aucun de ces identificateurs de table ou de colonne n'est un mot réservé ou n'utilise de caractères nécessitant des guillemets, mais je les ai quand même cités avec des backticks (plus à ce sujet plus tard...).

Fonctions natives du RDBMS (par exemple, NOW() dans MySQL) ne doivent pas être entre guillemets, 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 & 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         ─────────────────────────────────────────┴┴┴┴┘    

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, celle-ci doit être entre guillemets doubles en PHP. Assurez-vous simplement que vous avez correctement échappé les variables à utiliser dans SQL. (Il est recommandé d'utiliser une API prenant en charge les instructions préparées à la place, comme protection contre l'injection SQL ).

// 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')";

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 ou non être cités. Les API les plus populaires disponibles en PHP, PDO et MySQLi, attendez-vous à sans guillemets espaces réservé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 des guillemets inverses dans les identifiants :

Selon la documentation MySQL , vous n'avez pas besoin de mettre entre guillemets (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 celui défini comme identifiants de table ou de colonne, y compris les espaces blancs par exemple, mais vous devez citez-les (backtick).

De plus, bien que les nombres soient des caractères valides pour les identifiants, les identifiants ne peuvent pas être constitués uniquement de chiffres. S'ils le font, ils doivent être entourés de backticks.