792 votes

Quand utiliser les guillemets simples, les guillemets doubles et les barres obliques inversées dans MySQL ?

J'essaie d'apprendre la meilleure façon d'écrire des requêtes. Je comprends également l'importance d'être cohérent. Jusqu'à présent, j'ai utilisé au hasard des guillemets simples, des guillemets doubles et des backticks sans vraiment réfléchir.

Exemple :

$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';

De même, dans l'exemple ci-dessus, considérez que table , col1 , val1 etc. peuvent être des variables.

Quelle est la norme en la matière ? Que faites-vous ?

Je lis des réponses à des questions similaires sur ce site depuis environ 20 minutes, mais il semble qu'il n'y ait pas de réponse définitive à cette question.

29 votes

Notez que cette question est très spécifique à MySQL. Le SQL en général (c'est-à-dire le SQL ISO/ANSI) a un ensemble différent de guillemets : les guillemets doubles sont pour les identificateurs délimités, par ex. "tablename" et les guillemets simples sont pour les littéraux, par ex. 'this is a some text' . Les guillemets ne sont jamais utilisés en SQL standard. (Si vous devez inclure un guillemet double dans un identificateur, tapez-le deux fois sous forme de "odd""tablename" . De même, les guillemets simples doubles dans les littéraux, comme 'Conan O''Brien' .)

761voto

Michael Berkowski Points 137903

Les astérisques doivent être utilisés pour les identificateurs de table et de colonne, mais ne sont nécessaires que lorsque l'identificateur est un numéro de série. Mot-clé réservé de MySQL Il est souvent recommandé d'éviter d'utiliser des mots-clés réservés comme identifiants de colonnes ou de tables, afin d'éviter le problème des guillemets.

Les guillemets simples doivent être utilisés pour les valeurs de type chaîne de caractères, comme dans l'exemple suivant VALUES() liste. Les guillemets doubles sont également pris en charge par MySQL pour les chaînes de caractères, mais les guillemets simples sont plus largement acceptés par les autres SGBDR, c'est donc une bonne habitude d'utiliser les guillemets simples plutôt que les doubles.

MySQL attend également DATE y DATETIME les valeurs littérales doivent être mises entre guillemets sous forme de chaînes de caractères comme '2001-01-01 00:00:00' . Consultez les littéraux de date et d'heure 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 dates.

En utilisant votre exemple, je mettrais la chaîne PHP entre guillemets et j'utiliserais des guillemets simples pour les valeurs. 'val1', 'val2' . NULL est un mot-clé MySQL, et une (non)-valeur spéciale, et est donc non citée.

Aucun de ces identifiants de table ou de colonne n'est un mot réservé ou n'utilise de caractères nécessitant une citation, mais je les ai tout de même cités avec des backticks (nous y reviendrons plus tard...).

Fonctions natives du SGBDR (par exemple, NOW() dans MySQL) ne doivent pas être cités, bien que leurs arguments soient soumis aux mêmes règles de citation des chaînes ou des identifiants 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 citation pour les variables ne changent pas, bien que si vous avez l'intention d'interpoler les variables directement dans une chaîne, elle doit être doublement citée en PHP. Assurez-vous simplement que vous avez correctement échappé les variables pour les utiliser en SQL. ( Il est recommandé d'utiliser une API supportant 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 caractères de remplacement de l'instruction doivent être cités ou non. Les API les plus populaires disponibles en PHP, PDO et MySQLi, prévoient non coté 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 la citation du backtick dans les identifiants :

Selon la documentation MySQL vous n'avez pas besoin de citer (backtick) les identifiants utilisant le jeu de caractères suivant :

ASCII : [0-9,a-z,A-Z$_] (lettres latines de base, chiffres de 0 à 9, dollar, trait de soulignement)

Vous pouvez utiliser des caractères au-delà de ce jeu comme identificateurs de table ou de colonne, y compris les espaces blancs par exemple, mais vous devez alors doit les citer (backtick).

En outre, bien que les chiffres soient des caractères valables pour les identificateurs, ces derniers ne peuvent pas être constitués uniquement de chiffres. Si c'est le cas, ils doivent être entourés de barres obliques inversées.

58 votes

" mais les guillemets simples sont plus largement acceptés par les autres SGBDR. "L'utilisation de guillemets simples pour les chaînes de caractères est définie (et requise) par la norme SQL.

0 votes

@a_horse_with_no_name presque personne n'utilise ANSI MySQL ('|' pour concat de chaîne - vraiment ?)

5 votes

Ce n'est pas vrai : "MySQL s'attend également à ce que les valeurs littérales DATE et DATETIME soient entre guillemets sous forme de chaînes de caractères comme '2001-01-01 00:00:00'".

164voto

Salman A Points 60620

Il existe deux types de guillemets dans MySQL :

  1. ' pour entourer les chaînes de caractères
  2. ` pour entourer les identifiants tels que les noms de tables et de colonnes

Et puis il y a " qui est un cas particulier. Il pourrait être utilisé pour un des objectifs susmentionnés à la fois, en fonction de la capacité du serveur MySQL. sql_mode :

  1. Par défaut le site " peut être utilisé pour entourer des chaînes de caractères littéraux, tout comme le caractère '
  2. Sur ANSI_QUOTES le mode " peut être utilisé pour entourer des identifiants, tout comme le caractère `

La requête suivante produira des résultats différents (ou des erreurs) selon le mode SQL :

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES désactivé

La requête sélectionnera la chaîne littérale "column" où colonne foo est égal à la chaîne de caractères "bar"

ANSI_QUOTES activé

La requête sélectionnera la colonne column où colonne foo est égale à la colonne bar

Quand utiliser quoi

  • Je vous suggère d'éviter d'utiliser " afin que votre code devienne indépendant des modes SQL
  • Toujours citer les identifiants car il s'agit d'une bonne pratique (plusieurs questions sur SO en parlent).

1 votes

Ou bien, exécutez votre MySQL en mode ANSI_QUOTES pour rendre vos compétences SQL plus portables, et utilisez la fonction ' pour les cordes, " pour les identifiants et n'utilisent pas de backticks. Il est toujours bon d'adhérer aux normes

37voto

ctrahey Points 12360

(Il y a de bonnes réponses ci-dessus concernant la nature SQL de votre question, mais cela peut également être pertinent si vous êtes nouveau en PHP).

Il est peut-être important de mentionner que PHP traite différemment les chaînes de caractères entre guillemets simples et doubles...

Les chaînes de caractères entre guillemets sont des "littéraux" et sont pratiquement des chaînes de caractères WYSIWYG. Les chaînes entre guillemets sont interprétées par PHP pour une éventuelle substitution de variable (les backticks en PHP ne sont pas exactement des chaînes de caractères ; ils exécutent une commande dans le shell et renvoient le résultat).

Exemples :

$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list

31voto

Starx Points 38727

Les backticks sont généralement utilisés pour indiquer une identifier et aussi bien être sûr d'utiliser accidentellement le Mots clés réservés .

Par exemple :

Use `database`;

Dans ce cas, les backticks aideront le serveur à comprendre que l'élément database est en fait le nom de la base de données, et non l'identifiant de la base de données.

On peut faire de même pour les noms des tables et des champs. C'est une méthode très bonne habitude si vous enveloppez votre identifiant de base de données avec des backticks.

Vérifiez este pour en savoir plus sur les backticks.


Maintenant, parlons des guillemets doubles et des guillemets simples (Michael en a déjà parlé).

Mais, pour définir une valeur, vous devez utiliser des guillemets simples ou doubles. Voyons un autre exemple.

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);

Ici, j'ai délibérément oublié d'envelopper les title1 avec des citations. Maintenant le serveur va prendre le title1 comme un nom de colonne (c'est-à-dire un identifiant). Pour indiquer qu'il s'agit d'une valeur, vous devez donc utiliser des guillemets doubles ou simples.

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');

Désormais, en combinaison avec PHP, les guillemets doubles et les guillemets simples facilitent grandement la rédaction de vos requêtes. Voyons une version modifiée de la requête de votre question.

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

Maintenant, en utilisant des guillemets dans le PHP, vous allez rendre les variables $val1 y $val2 d'utiliser leurs valeurs, créant ainsi une requête parfaitement valide. Comme

$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

fera

INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')

16voto

xdazz Points 85907

Les chaînes de caractères dans MySQL et PHP sont les mêmes.

Une chaîne de caractères est une séquence d'octets ou de caractères, enfermée entre guillemets simples ("'") ou doubles (""").

Ainsi, si votre chaîne contient des guillemets simples, vous pouvez utiliser des guillemets doubles pour la citer, ou si elle contient des guillemets doubles, vous pouvez utiliser des guillemets simples pour la citer. Mais si votre chaîne contient à la fois des guillemets simples et des guillemets doubles, vous devez échapper celui qui a été utilisé pour citer la chaîne.

La plupart du temps, nous utilisons des guillemets simples pour une valeur de chaîne SQL, et nous devons donc utiliser des guillemets doubles pour une chaîne PHP.

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";

Et vous pouvez utiliser une variable dans la chaîne de caractères doublement citée de PHP :

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";

Mais si $val1 o $val2 contient des guillemets simples, cela rendra votre SQL erroné. Vous devez donc l'échapper avant qu'il ne soit utilisé dans le SQL ; c'est ce que fait mysql_real_escape_string est pour. (Bien qu'une déclaration préparée soit préférable).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X