Question Quand utiliser des guillemets simples, des guillemets doubles et des coches de retour dans MySQL


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

Exemple:

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

En outre, dans l'exemple ci-dessus, considérez que "table," "col[n]," and "val[n]" peut être des variables.

Quelle est la norme pour cela? Que faire?

J'ai lu des réponses à des questions similaires pendant environ 20 minutes, mais il semble qu'il n'y ait pas de réponse définitive à cette question.


494
2017-07-04 01:53


origine


Réponses:


Les guillemets doivent être utilisés pour les identificateurs de table et de colonne, mais ne sont nécessaires que si l'identificateur est un Mot-clé réservé MySQLou lorsque l'identificateur contient des caractères ou caractères d'espaces 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 identifiants de colonne ou de tableau, évitant ainsi le problème de la citation.

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 SGBDR, c'est donc une bonne habitude d'utiliser des guillemets simples au lieu de doubles.

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

Donc, en utilisant votre exemple, je voudrais citer deux fois la chaîne PHP et utiliser 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 cité.

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

Fonctions natives du SGBDR (par exemple, NOW() en MySQL) ne doivent pas être cités, bien que leurs arguments soient soumis à la même chaîne ou au même identifiant en citant les règles déjà mentionnées.

Backtick (`)
table et colonne ─────────────────────────────────────── ───────┐
                      ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = "INSERT INTO `table` (` id`, `col1`,` col2`, `date`,` updated`)
                       VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW ())";
                               ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑
Mot clé non cité ─────┴┴┴┘ │ │ │ │ │ │
Chaînes à guillemets simples (') ───────────────────────────
Guillemet 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, il doit être double-cité en PHP. Assurez-vous simplement que vous avez correctement échappé aux variables pour une utilisation en SQL. (Il est recommandé d'utiliser une API prenant en charge les instructions préparées, en guise de protection contre l'injection SQL.).

// Même chose avec certains remplacements variables
// Ici, une table $ name de la table des variables est en guillemets, et les variables
// dans la liste des valeurs sont entre guillemets simples
$ query = "INSERT INTO `$ table` (`id`,` col1`, `col2`,` date`) VALEURS (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 indiqués. Les API les plus populaires disponibles en PHP, PDO et MySQLi, attendent non cité les espaces réservés, comme le font la plupart des API de déclarations 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 citant dans les identifiants:

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

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

Vous pouvez utiliser des caractères au-delà de cet ensemble comme identificateurs de table ou de colonne, y compris les espaces blancs par exemple, mais vous doit citez (backtick) eux.


480
2017-07-04 01:57



Il y a deux types de guillemets dans MySQL:

  1. ' pour enfermer des littéraux de chaîne
  2. ` pour inclure des identificateurs tels que des noms de table et de colonne

Et puis il y a " ce qui est un cas particulier. Il pourrait être utilisé pour un des objectifs mentionnés ci-dessus à la fois en fonction du serveur MySQL sql_mode:

  1. Par défaut la " caractère peut être utilisé pour inclure des littéraux de chaîne comme '
  2. Dans ANSI_QUOTES mode le " caractère peut être utilisé pour inclure des identificateurs comme `

La requête suivante produira différents résultats (ou erreurs) en fonction du mode SQL:

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

ANSI_QUOTES désactivé

La requête sélectionnera le littéral de chaîne "column" où colonne foo est égal à chaîne "bar"

ANSI_QUOTES activé

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

Quand utiliser quoi

  • Je suggère que vous évitez d'utiliser " pour que votre code devienne indépendant des modes SQL
  • Toujours citer des identifiants car c'est une bonne pratique (quelques questions sur SO en discuter)

97
2018-01-02 14:17



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

Peut-être est-il important de mentionner que PHP gère les chaînes entre guillemets simples et doubles ...

Les chaînes à guillemets simples sont des 'littéraux' et sont à peu près des chaînes WYSIWYG. Les chaînes entre guillemets doubles sont interprétées par PHP pour une éventuelle substitution de variable (les backticks en PHP ne sont pas exactement des chaînes, 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

29
2017-07-04 02:03



Backticks sont généralement utilisés pour indiquer un identifier et aussi bien sûr d'utiliser accidentellement le Mots-clés réservés.

Par exemple:

Use `database`;

Ici, les backticks aideront le serveur à comprendre que le database est en fait le nom de la base de données, pas l'identifiant de la base de données.

La même chose peut être faite pour les noms de table et les noms de champs. C'est un très bonne habitude si vous encapsulez votre identifiant de base de données avec des backticks.

Vérifier ce répondre pour en savoir plus sur les backticks.


Maintenant, à propos de citations doubles et citations uniques (Michael a déjà mentionné cela).

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 le title1 avec des citations. Maintenant, le serveur prendra la title1 en tant que nom de colonne (c'est-à-dire un identifiant). Donc, pour indiquer qu'il s'agit d'une valeur, vous devez utiliser des guillemets simples ou doubles.

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

Maintenant, en combinaison avec PHP, les guillemets doubles et les guillemets simples rendent le temps d'écriture de votre requête beaucoup plus facile. Voyons une version modifiée de la requête dans votre question.

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

Maintenant, en utilisant des guillemets doubles dans PHP, vous allez créer les variables $val1, et $val2 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')

18
2017-07-04 02:00



Fondamentalement, dans Mysql, il y a ces types d'identifiant qui sont utilisés dans la requête ` ," ,' et () .

  1. " ou ' utiliser pour entourer les valeurs comme des chaînes "26-01-2014 00:00:00" ou '26-01-2014 00:00:00' . Ces identifiants ne sont utilisés que pour les chaînes, pas la fonction d'agrégation comme now() or sum ,max etc.

  2. `  utiliser pour enfermer une table ou une colonne de table, par ex. sélectionner column_name de table_name où id = '2'

  3. () ne sont utilisées que pour inclure des parties de la requête, par ex. sélectionner column_name de table_name où (id = '2' et gender = 'male') ou name = 'rakesh'.


12
2018-01-03 11:42



Les littéraux de chaîne dans MySQL et PHP sont les mêmes.

Une chaîne est une séquence d'octets ou de caractères, incluse dans   guillemet simple ("'") ou guillemets ("" ").

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

La plupart du temps, nous utilisons des guillemets simples pour une valeur de chaîne SQL, 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 guillemets doubles de PHP:

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

Mais si $val1 ou $val2 contient des guillemets simples, ce qui rendra votre SQL erroné. Vous devez donc y échapper avant de l'utiliser en SQL. c'est ce que mysql_real_escape_string est pour. (Bien qu'une déclaration préparée soit meilleure.)


11
2017-07-04 02:16



En combinant PHP et MySQL, les guillemets doubles et les guillemets simples rendent votre temps d'écriture de requête beaucoup plus facile.

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

Maintenant, supposons que vous utilisiez une variable de post direct dans la requête MySQL, alors utilisez-la comme ceci:

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

C'est la meilleure pratique pour utiliser des variables PHP dans MySQL.


10
2018-06-16 10:25