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

310

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 à recevoir une erreur car je pense que l'apostrophe après le O est la balise de fin de la valeur.

leora
la source
16
Veuillez confirmer que vous ne vous ouvrez pas aux attaques par injection SQL. Utilisez autant que possible les paramètres.
Andrew
Quel langage de script utilisez-vous? Il existe des fonctions en PHP, par exemple, pour le faire correctement pour vous.
philfreo
Je suis 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 autre et pas réellement quelque part dans le code de production. Ne pas utiliser d'instructions paramétrées est une folie.
charstar
c'est en fait dans le code .. si j'avais une requête paramétrée, ne devrais-je pas faire la même chose?
leora
2
Négatif. En fonction de la base de données et du pilote que vous utilisez, l'isolement des paramètres peut être géré différemment, mais les paramètres d'une instruction paramétrée ne nécessitent pas d'échappement. Voir en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

Réponses:

485

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

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          right here  

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

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

L'apostrophe, ou guillemet simple, 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 le cadre de vos données de chaîne littérale, vous devez utiliser escapele caractère spécial. Avec un seul devis, cela se fait généralement en doublant votre devis. (Deux guillemets simples, pas des guillemets doubles au lieu d'un guillemet simple.)

Remarque : vous ne devez vous soucier de ce problème que lorsque vous modifiez 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 une occurrence rare. Dans le code, il existe des techniques et des cadres (selon votre pile) qui prennent en charge les caractères spéciaux d'échappement, l' injection SQL , etc.

Paul Sasik
la source
6
$ linkQuestion = str_replace ("'", "' '", $ linkQuestion); (ça alors c'est difficile à lire!)
user462990
que se passe-t-il si les données sont Insérer dans la personne (première, dernière) Valeurs «Joe», «Boutique du père».
vijesh
37

Il suffit de doubler les guillemets simples ...

insert into Person (First, Last)
values ('Joe', 'O''Brien')
Justin Niessner
la source
21

Vous devez échapper à l'apostrophe. Dans T-SQL, c'est avec une double apostrophe, donc votre insertdéclaration devient:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
David Hall
la source
AFAIK le Valuesdoit être placé entre accolades (ce qui en fait alors la même réponse que celle de @JustinNiessner)
qwerty_so
15

Parce qu'un guillemet simple est utilisé pour indiquer le début et la fin d'une chaîne; vous devez y échapper.

La réponse courte est d'utiliser deux guillemets simples - ''- pour qu'une base de données SQL stocke la valeur sous '.

Regardez à l'aide de REMPLACER pour nettoyer les valeurs entrantes:

Vous voulez vérifier ''''et les remplacer s'ils existent dans la chaîne ''''''afin d'échapper au guillemet simple.

Poneys OMG
la source
3

eduffy a eu une bonne idée . Il vient de le récupérer dans son exemple de code. En JavaScript ou en SQLite, vous pouvez remplacer l'apostrophe par le symbole d'accent.

Il (accidentellement je suis sûr) a placé le symbole d'accent comme délimiteur pour la chaîne au lieu de remplacer l'apostrophe dans O'Brian. C'est en fait une solution terriblement simple pour la plupart des cas.

Robert Sherman
la source
Grande et beaucoup plus simple solution et mon nom de famille est O`Reilly!
PhillipOReilly
Quoi qu'il en soit, il est conseillé d'utiliser des caractères d'échappement. Par accident :) depuis le jour où j'utilise le clavier. J'utilise involontairement un symbole d'accent à la place d'une citation unique lors de la rédaction de documents. (cependant dans le code j'utilise 'comme identifiant de caractère). Jusqu'à l'année dernière, quand quelqu'un m'a dit son mot de passe et que je n'ai pas pu me connecter à son système. nous ne pouvions pas comprendre avant des heures que je tape «comme».
Apprenant le
3

Le caractère d'apostrophe peut être inséré en appelant la fonction CHAR avec la valeur de recherche de table ASCII de l'apostrophe , 39. Les valeurs de chaîne peuvent ensuite être concaténées avec un opérateur de concaténation .

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')
Nathan
la source
2

Les guillemets simples sont échappés en les doublant ,

Le SQL suivant illustre cette fonctionnalité.

declare @person TABLE (
    [First] nvarchar(200),
    [Last] nvarchar(200)
)

insert into @person 
    (First, Last)
values
    ('Joe', 'O''Brien')

select * from @person

Résultats

First   | Last
===================
Joe     | O'Brien
Max Pringle
la source
0

utilisez des guillemets doubles autour des valeurs.

insert into Person (First, Last) Values("Joe","O'Brien")
erreur d'exécution
la source
3
Notez que ce n'est plus du SQL standard, bien que je sache qu'Informix, pour ne citer qu'un seul SGBD, le permet. Vous devez également indiquer comment insérer une chaîne, par exemple en He said, "Don't!"utilisant des guillemets simples et / ou des guillemets doubles - ce qui peut être fait: 'He said, "Don''t!"'ou "He said, ""Don't!""". Lorsque vous ajoutez une nouvelle réponse à une question établie de longue date avec des réponses acceptées, vous devez fournir de nouvelles informations complètes. L'utilisation de guillemets doubles est nouvelle - mais limitée à quelques SGBD; vous devriez vous efforcer d'identifier au moins un de ceux qui les acceptent.
Jonathan Leffler
-1

Utilisez plutôt un backtick (sur la touche ~);

`O'Brien`
eduffy
la source
1
Alors le problème devient: comment insérer un backtick?
Jasper de Vries du
1
Bien que ce ne soit pas la «bonne» réponse, je travaille avec un ensemble de noms qui n'ont pas cela, et je fais des opérations ponctuelles, donc cela a immédiatement résolu mon problème. Merci!
nscalf