403 votes

Comment insérer une valeur contenant une apostrophe (guillemet simple) ?

Quelle est la syntaxe SQL correcte pour insérer une valeur contenant une apostrophe ?

Insert into Person
  (First, Last)
Values
  'Joe',
  'O'Brien'

Je continue de recevoir une erreur car je pense que l'apostrophe après le O est la balise de fin de la valeur.

22 votes

Veuillez confirmer que vous ne vous exposez pas aux attaques par injection SQL. Utilisez des paramètres lorsque cela est possible.

0 votes

Quel langage de script utilisez-vous? Il y a des fonctions en PHP, par exemple, pour le faire correctement pour vous.

0 votes

D'accord avec Andrew ici: J'espère que cette question concerne uniquement l'exécution de SQL via un client SQL ou un "navigateur de requêtes" ou similaire et non pas réellement quelque part dans le code de production. Ne pas utiliser de déclarations paramétrées est une folie.

611voto

Paul Sasik Points 37766

Échappez à l'apostrophe (c'est-à-dire doublez le caractère apostrophe) dans votre SQL :

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          juste ici

La même chose s'applique aux requêtes SELECT :

SELECT First, Last FROM Person WHERE Last = 'O''Brien'

L'apostrophe, ou simple quote, est un caractère spécial en SQL qui spécifie le début et la fin des données de chaîne. Cela signifie que pour l'utiliser dans vos données de chaîne littérale, vous devez échapper le caractère spécial. Avec une apostrophe, cela est généralement réalisé en doublant votre apostrophe (deux caractères d'apostrophe simple, pas d'apostrophe double à la place d'une apostrophe simple).

Remarque : Vous ne devriez jamais vous soucier de ce problème que lorsque vous éditez manuellement des données via une interface SQL brute, car l'écriture de requêtes en dehors du développement et des tests devrait être rare. Dans le code, il existe des techniques et des frameworks (selon votre pile technologique) qui se chargent de l'échappement des caractères spéciaux, des injections SQL, etc.

7 votes

$linkQuestion = str_replace ("'","''", $linkQuestion); (mon dieu, c'est difficile à lire!)

0 votes

Et si les données sont insérées dans Personne (Prénom, Nom) Valeurs 'Joe', 'Boutique du père'.

0 votes

Cela ne sert à rien si vous devez le faire via un script, comme le mentionne Vijesh. Supposons que la chaîne littérale soit inaltérable. Comment travaillez-vous avec?

48voto

Justin Niessner Points 144953

Vous devez simplement doubler les apostrophes simples...

insert into Personne (Prenom, Nom)
values ('Joe', 'O''Brien')

29voto

David Hall Points 17450

Vous devez échapper à l'apostrophe. En T-SQL c'est avec un double apostrophe, donc votre déclaration insert devient:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'

0 votes

Autant que je sache, les Valeurs doivent être encloses entre des accolades (ce qui en fait alors la même réponse que celle de @JustinNiessner)

18voto

OMG Ponies Points 144785

Parce qu'une apostrophe est utilisée pour indiquer le début et la fin d'une chaîne de caractères; vous devez l'échapper.

La réponse courte est d'utiliser deux apostrophes simples - '' - afin qu'une base de données SQL puisse stocker la valeur comme '.

Regardez l'utilisation de REPLACE pour nettoyer les valeurs entrantes :

Vous voulez vérifier la présence de '''', et les remplacer s'ils existent dans la chaîne par '''''' afin d'échapper à l'apostrophe seule.

-2voto

eduffy Points 17061

Utilisez un backtick (sur la touche ~) à la place;

`O'Brien`

1 votes

Ensuite, le problème devient : comment insérer un backtick?

1 votes

Alors que ce n'est pas la réponse "correcte", je travaille avec un ensemble de noms qui n'ont pas cela, et je réalise des opérations ponctuelles, donc cela a immédiatement résolu mon problème. Merci!

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