Quand utiliser des guillemets simples, des guillemets doubles, et des tics arrière 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 tics arrière sans aucune réelle pensée.

exemple:

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

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

Quelle est la norme pour cela? Que faites-vous?

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

513
demandé sur Nate 2012-07-04 05:53:36

12 réponses

Backticks doivent être utilisés pour la table et de la colonne des identifiants, mais ne sont nécessaires que lorsque l'identificateur est un MySQL mot réservé , ou lorsque l'identificateur 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 qu'à la colonne ou de la table des identificateurs lorsque cela est possible, en évitant de citer question de.

les guillemets simples doivent être utilisés pour les valeurs de chaîne comme dans VALUES() liste. Les guillemets doubles sont supportés par MySQL pour les valeurs de chaîne aussi bien, 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 s'attend également à ce que les valeurs littérales DATE et DATETIME soient des chaînes de caractères comme '2001-01-01 00:00:00' . Consultez la documentation la Date et L'heure littérales 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 datation.

donc en utilisant votre exemple, je citerais deux fois la chaîne PHP et j'utiliserais des guillemets simples sur les valeurs 'val1', 'val2' . NULL est un mot-clé MySQL, et une valeur (non) - spéciale, et est donc non cité.

aucun de ces identificateurs de table ou de colonne ne sont des mots réservés ou utilisent des caractères exigeant une citation, mais je les ai cités de toute façon avec des Rétro-repères (plus sur ceci plus tard...).

Les fonctions

natives des RDBMS (par exemple, NOW() dans MySQL) ne doivent pas être citées, bien que leurs arguments soient soumis à la même chaîne de caractères ou aux mêmes règles de citation d'identificateur 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 citations 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 juste que vous avez correctement échappé les variables à utiliser dans SQL. ( il est recommandé d'utiliser plutôt une API supportant les déclarations préparées, 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')";

Préparées

lorsque vous travaillez avec des énoncés préparés, consultez la documentation pour déterminer si les espaces réservés à l'énoncé doivent être cités ou non. Les API les plus populaires disponibles en PHP, PDO et MySQLi, attendez-vous à non cotées espaces réservés, comme le font la plupart de l'instruction préparée Api 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 requring backtick citant dans les identificateurs:

selon la documentation MySQL , vous n'avez pas besoin de citer des identificateurs (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 par exemple, mais alors vous doit citation (backtick) eux.

500
répondu Michael Berkowski 2017-08-20 05:34:51

il y a deux types de citations dans MySQL:

  1. ' pour délimiter les chaînes de caractères littérales
  2. ` pour l'insertion d'identificateurs tels que les noms de tableaux et de colonnes

et puis il y a " qui est un cas particulier. Il pourrait être utilisé pour un des fins mentionnées ci-dessus à la fois en fonction de MySQL Serveur sql_mode :

  1. par défaut le caractère " peut être utilisé pour enfermer des chaînes littérales comme '
  2. In ANSI_QUOTES mode le caractère " peut être utilisé pour inclure des identificateurs comme `

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

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

ansi_quotes disabled

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

ansi_quotes enabled

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

quand utiliser quoi

  • je vous conseille d'éviter utiliser " pour que votre code devienne indépendant des modes SQL
  • toujours citer des identificateurs car il s'agit d'une bonne pratique (un certain nombre de questions à ce sujet, discuter de ce)
100
répondu Salman A 2018-07-20 23:45:06

(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 en PHP.)

peut-être est-il important de mentionner que PHP traite différemment les chaînes à guillemets simples et doubles...

les cordes simples sont 'littérales' et sont à peu près des cordes WYSIWYG. Les chaînes de caractères à guillemets doubles sont interprétées par PHP pour une possible substitution de variables (les pas exactement des chaînes de caractères; elles 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
répondu Chris Trahey 2015-11-26 11:13:10

Backticks sont généralement utilisés pour indiquer un identifier et ainsi être safe accidentellement à l'aide de la mots 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.

même chose peut être fait pour les noms de table et les noms de champ. Il s'agit d'un très bonne habitude si vous envelopper votre Identificateur de base de données avec des bâtons arrière.

Vérifier ce répondre à comprendre plus au sujet de backticks.


maintenant au sujet des doubles citations et des simples citations (Michael a déjà mentionné cela).

Mais, pour définir une valeur, vous devez utiliser des guillemets simples et doubles. Permet de voir un autre exemple.

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

ici, j'ai délibérément oublié d'envelopper le title1 de citations. Maintenant le serveur va prendre le title1 comme nom de colonne (i.e. un identifiant). Donc, pour indiquer que c'est une valeur, vous devez utiliser soit des guillemets doubles ou simples.

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

maintenant, en combinaison avec PHP, les guillemets doubles et les guillemets simples rendent votre temps d'écriture de requête beaucoup plus facile. Nous allons voir un 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 le PHP , vous allez faire les variables $val1 , et $val2 pour 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')
19
répondu Starx 2017-08-20 22:04:05

fondamentalement dans Mysql, il ya ces types d'identificateur sont utilisés dans la requête ` , " , ' et () .

  1. " ou ' utiliser pour entourer la chaîne de valeurs similaires "26-01-2014 00:00:00" ou '26-01-2014 00:00:00' . Ces identificateurs n'utilisent que pour la chaîne de caractères et non la fonction agrégée comme now() or sum ,max etc.

  2. ` utilisation pour colonne de tableau, p.ex. sélectionner column_name de table_name où id = "2 "

  3. () ne sont utilisés que pour contenir des parties de la requête, par exemple sélectionner column_name dans table_name où (id='2' et sexe='mâle') ou nom='rakesh' .

12
répondu Kumar Rakesh 2017-03-27 19:31:23

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

Une chaîne est une séquence d'octets ou de caractères, enfermé à l'intérieur l'apostrophe ("'") ou des guillemets (""") caractères.

Donc, si votre chaîne contient des guillemets simples, vous pouvez utiliser des guillemets pour citer la chaîne, ou si elle contient des guillemets, vous pouvez utiliser des guillemets simples pour citer la chaîne. Mais si votre chaîne contient les deux guillemets et doubles guillemets, vous devez échapper à celui qui a utilisé pour 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 double citation de PHP:

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

mais si $val1 ou $val2 contient des guillemets simples, cela rendra votre SQL erroné. Vous devez donc vous en échapper avant de l'utiliser. en sql, c'est à ça que sert mysql_real_escape_string . (Bien qu'une déclaration préparée soit préférable.)

11
répondu xdazz 2015-11-26 11:26:05

en combinaison de PHP et MySQL, les guillemets doubles et les guillemets simples rendent votre temps d'écriture de requête tellement 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 de cette façon:

$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
répondu vipul sorathiya 2017-06-22 04:59:24

si les colonnes et les valeurs du tableau sont des variables, alors il y a deux façons:

Avec des guillemets doubles "" la requête complète:

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

ou

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

avec guillemets '' :

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

utiliser les anciens mots-clés `` lorsqu'un nom de colonne/valeur est similaire à un mot-clé MySQL réservé.

Note: si vous êtes dénoter un nom de colonne avec un nom de table puis utiliser des tics arrière comme ceci:

`table_name` . `column_name` <-- Note: exclut les . à partir de l'arrière de tiques.

9
répondu diEcho 2017-08-20 22:11:38

il y a eu beaucoup de réponses utiles ici, aboutissant généralement à deux points.

  1. BACKTICKS(`) sont utilisés dans l'identificateur de noms.
  2. les guillemets simples (') sont utilisés autour des valeurs.

et comme @MichaelBerkowski a dit

Backticks doivent être utilisés pour la table et de la colonne des identifiants, mais sont uniquement nécessaire lorsque l'identificateur est un MySQL mot clé réservé, ou lorsque l'identificateur contient des espaces ou des caractères au-delà d'un ensemble limité (voir ci-dessous), Il est souvent recommandé d'éviter utilisation de mots-clés réservés comme identificateurs de colonne ou de table lorsque cela est possible, éviter la question des citations.

il y a un cas cependant où un identifiant ne peut pas être un mot-clé réservé ou contenir espaces ou caractères au-delà de Limité mis mais nécessairement exiger des bâtons arrière autour d'eux.

exemple

123E10 est un nom d'identification valide, mais aussi un INTEGER littéral.

[sans entrer dans les détails comment vous obtiendriez un tel nom d'identifiant], supposons que je veuille créer une table temporaire nommée 123456e6 .

Pas d'ERREUR sur les backticks.

DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

erreur lors de la non-utilisation des bâtons arrière.

DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1

cependant, 123451a6 est un nom d'identification parfaitement fin (sans tiques arrière).

DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

C'est parce que 1234156e6 est aussi un nombre exponentiel.

8
répondu MPJ 2018-09-07 07:11:28

les guillemets simples doivent être utilisés pour les valeurs de chaîne comme dans la liste des valeurs ().

les bâtons arrière sont généralement utilisés pour indiquer un identificateur et aussi être à l'abri de l'utilisation accidentelle des mots-clés réservés.

en combinaison de PHP et MySQL, les guillemets doubles et les guillemets simples rendent votre temps d'écriture de requête tellement plus facile.

7
répondu john igneel 2015-11-26 12:27:13

mis à part toutes les réponses (bien expliquées), il n'y a pas eu les suivantes mentionnées et je visite cette Q&R assez souvent.

en un mot; MySQL pense que vous voulez faire des mathématiques sur sa propre table/colonne et interprète des tirets tels que" e-mail "comme e moins mail .


avertissement: donc j'ai pensé que je voudrais ajouter ceci comme un Type de réponse" pour information " pour ceux qui sont tout à fait novices dans le travail avec les bases de données et qui ne comprennent peut-être pas les termes techniques déjà décrits.

2
répondu Funk Forty Niner 2018-02-18 22:10:23

les serveurs SQL et MySQL, PostgreySQL, Oracle ne comprends pas les guillemets doubles("). Ainsi votre requête devrait être libre de guillemets doubles(") et ne devrait utiliser que des guillemets simples(').

Back-trip (`) est facultatif en SQL et est utilisé pour le nom de la table, le nom de la base de données et les noms des colonnes.

si vous essayez d'écrire une requête dans votre back-end pour appeler MySQL alors vous pouvez utiliser des guillemets doubles(") ou des guillemets simples(') pour assigner la requête à une variable comme:

let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';

S'il y a une instruction where dans votre requête et/ou en essayant de insert une valeur et/ou une update de valeur qui est une chaîne de caractères, Utilisez simple quote(') pour ces valeurs comme: "15198090920"

let querySelect = "select id, name from accounts where name = 'John'";
let queryUpdate = "update accounts set name = 'John' where id = 8";
let queryInsert = "insert into accounts(name) values('John')";

//Please not that double quotes are only to be used in assigning string to our variable not in the query
//All these below will generate error

let querySelect = 'select id, name from accounts where name = "John"';
let queryUpdate = 'update accounts set name = "John" where id = 8';
let queryInsert = 'insert into accounts(name) values("John")';

//As MySQL or any SQL doesn't understand double quotes("), these all will generate error.

si vous voulez rester en dehors de cette confusion quand utiliser des guillemets doubles (") et des guillemets simples ('), recommanderait de coller avec des guillemets simples ( ') cela inclura des antislash () comme:

let query = 'select is, name from accounts where name = \'John\'';

problème avec double (") ou les guillemets simples(') apparaissent lorsque nous avons dû attribuer une valeur dynamique et effectuer une concaténation de chaîne comme:

let query = "select id, name from accounts where name = " + fName + " " + lName;
//This will generate error as it must be like name = 'John Smith' for SQL
//However our statement made it like name = John Smith

//In order to resolve such errors use
let query = "select id, name from accounts where name = '" + fName + " " + lName + "'";

//Or using backslash(\)
let query = 'select id, name from accounts where name = \'' + fName + ' ' + lName + '\'';

si vous avez besoin d'une autorisation supplémentaire, veuillez suivre guillemets en JavaScript

0
répondu NAVIN 2018-08-22 06:47:23