Come inserire un valore che contiene un apostrofo (virgoletta singola)?


310

Qual è la sintassi SQL corretta per inserire un valore con un apostrofo al suo interno?

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

Continuo a ricevere un errore poiché penso che l'apostrofo dopo O sia il tag finale per il valore.


16
Conferma di non aprirti agli attacchi di iniezione SQL. Utilizzare i parametri ove possibile.
Andrew,

Quale linguaggio di scripting stai usando? Ci sono funzioni in PHP, ad esempio, per farlo correttamente per te.
Philfreo,

Concordo con Andrew qui: spero che questa domanda riguardi solo l'esecuzione di SQL tramite un client SQL o "browser di query" o simili e non in realtà da qualche parte nel codice di produzione. Non usare dichiarazioni con parametri è follia.
Charstar il

in realtà è nel codice .. se avessi una query con parametri non dovrei fare la stessa cosa?
leora,

2
Negativo. A seconda del database e del driver che si sta utilizzando, l'isolamento dei parametri potrebbe essere gestito in modo diverso, ma i parametri in un'istruzione con parametri non richiedono l'escaping. Vedi en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

Risposte:


485

Esci dall'apostrofo (ovvero raddoppia il singolo carattere di virgolette) nel tuo SQL:

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

Lo stesso vale per le query SELECT:

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

L'apostrofo, o virgoletta singola, è un carattere speciale in SQL che specifica l'inizio e la fine dei dati della stringa. Ciò significa che per usarlo come parte dei dati della stringa letterale è necessario escapeil carattere speciale. Con una singola citazione, questo viene generalmente ottenuto raddoppiando la tua citazione. (Due caratteri a virgoletta singola, non a virgoletta doppia anziché a virgoletta singola.)

Nota : dovresti preoccuparti di questo problema solo quando modifichi manualmente i dati tramite un'interfaccia SQL non elaborata poiché la scrittura di query al di fuori dello sviluppo e dei test dovrebbe essere un evento raro. Nel codice ci sono tecniche e framework (a seconda del tuo stack) che si occupano della fuga di caratteri speciali, iniezione SQL , ecc.


6
$ linkQuestion = str_replace ("'", "' '", $ linkQuestion); (Accidenti è difficile da leggere!)
user462990

cosa succede se i dati sono Inserisci in persona (primo, ultimo) Valori "Joe", "Negozio del padre".
venerdì

37

Devi solo raddoppiare le virgolette singole ...

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

21

Devi scappare dall'apostrofo. In T-SQL questo è con un doppio apostrofo, quindi la tua insertaffermazione diventa:

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

AFAIK il Valuesdeve essere racchiuso tra parentesi graffe (che quindi rende la stessa risposta di quella di @JustinNiessner)
qwerty_so

15

Perché una singola virgoletta viene utilizzata per indicare l'inizio e la fine di una stringa; devi scappare.

La risposta breve è usare due virgolette singole - ''- affinché un database SQL memorizzi il valore come '.

Guarda usando REPLACE per disinfettare i valori in entrata:

Si desidera verificare ''''e sostituirli se esistono nella stringa con ''''''al fine di sfuggire alla singola virgola solitaria.


3

Eduffy ha avuto una buona idea . L'ha appena capovolto nel suo esempio di codice. In JavaScript o in SQLite puoi sostituire l'apostrofo con il simbolo dell'accento.

Lui (per inciso ne sono sicuro) ha posizionato il simbolo dell'accento come delimitatore per la corda invece di sostituire l'apostrofo in O'Brian. Questa è in realtà una soluzione terribilmente semplice per la maggior parte dei casi.


Ottima e molto più semplice soluzione e il mio cognome è O`Reilly!
PhillipOReilly,

Si consiglia comunque di usare i caratteri di escape. Per caso :) dal giorno in cui utilizzo la tastiera. Sto usando involontariamente il simbolo di accento al posto della virgoletta singola durante la scrittura di documenti. (comunque nel codice uso 'come identificatore di caratteri). Fino all'anno scorso quando qualcuno mi ha detto la sua password e non sono stato in grado di accedere al suo sistema. non siamo riusciti a capire fino a ore che sto scrivendo 'come `.
Studente l'


2

Le virgolette singole vengono eliminate raddoppiandole ,

Il seguente SQL illustra questa funzionalità.

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

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

select * from @person

risultati

First   | Last
===================
Joe     | O'Brien

0

utilizzare le virgolette doppie attorno ai valori.

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

3
Si noti che questo non è più lo standard SQL, anche se conosco Informix, per citarne solo un DBMS, lo consente. Dovresti anche considerare come inserire una stringa come l' He said, "Don't!"uso di virgolette singole e / o virgolette doppie, cosa che può essere fatta: 'He said, "Don''t!"'o "He said, ""Don't!""". Quando si aggiunge una nuova risposta a una domanda consolidata con risposte accettate, è necessario fornire informazioni nuove e complete. L'uso delle virgolette doppie è nuovo, ma limitato a pochi DBMS; dovresti prenderti cura di identificare almeno uno di quelli che li accetta.
Jonathan Leffler,

-1

Utilizzare invece un backtick (sul tasto ~);

`O'Brien`

1
Quindi il problema diventa: come inserire un backtick?
Jasper de Vries,

1
Anche se questa non è la risposta "giusta", sto lavorando con una serie di nomi che non hanno questo, e sto facendo operazioni una tantum, quindi questo ha immediatamente risolto il mio problema. Grazie!
nscalf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.