2009-12-16 47 views
210

Qual è la sintassi SQL corretta per inserire un valore con un apostrofo in esso?Come inserire un valore che contiene un apostrofo (virgoletta singola)?

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.

+13

Conferma che non ti stai aprendo agli attacchi di SQL injection. Utilizzare i parametri dove possibile. – Andrew

+0

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

+0

Accetto 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 qualche punto nel codice di produzione. Non usare le dichiarazioni parametriche è follia. – charstar

risposta

320

fuga l'apostrofo (cioè double-up il carattere apice singolo) in SQL:

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

Lo stesso vale per le query di selezione:

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 di stringa. Ciò significa che per utilizzarlo come parte dei dati stringa letterali è necessario il escape il carattere speciale. Con una sola citazione questo viene in genere ottenuto raddoppiando la tua quotazione. (Due singoli caratteri di citazione, non virgolette doppie invece di una sola offerta.)

Nota: Si dovrebbe sempre e solo preoccuparsi di questo problema quando si modifica manualmente i dati tramite un'interfaccia SQL prime in quanto la scrittura di query al di fuori di sviluppo e il test dovrebbe essere un evento raro. Nel codice ci sono tecniche e quadri (a seconda del tuo stack) che si occupano di caratteri speciali in fuga, SQL injection, ecc

+4

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

15

È necessario evitare l'apostrofo. In T-SQL questo è con un doppio apostrofo, quindi la sua dichiarazione insert diventa:

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

AFAIK i 'Valori' devono essere racchiusi tra parentesi graffe (che quindi rende la stessa risposta di @JustinNiessner) –

-2

Utilizzare un apice inverso (il tasto ~) al posto;

`O'Brien` 
+3

A meno che tu non sia quello che sta effettuando l'immissione dei dati ... – BillyNair

+1

Quindi il problema diventa: come inserire un backtick? –

27

Basta raddoppiare le virgolette singole ...

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

Perché una singola citazione è usata per indicare l'inizio e la fine di una stringa; devi fuggire.

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

guardare con REPLACE per disinfettare i valori in entrata:

Si vuole verificare la presenza di '''', e sostituirli se esiste nella stringa con '''''' per sfuggire alla sola citazione singola.

1

eduffy had a good idea. L'ha appena fatto all'indietro nel suo esempio di codice. In JavaScript o in SQLite è possibile sostituire l'apostrofo con il simbolo dell'accento.

Lui (per errore sono sicuro) ha posizionato il simbolo dell'accento come delimitatore per la stringa invece di sostituire l'apostrofo in O'Brian. Questa è in effetti una soluzione straordinariamente semplice per la maggior parte dei casi.

0

Il carattere apostrofo può essere inserito chiamando la funzione CHAR con il valore della apostrofo ASCII table lookup, 39. I valori stringa possono essere concatenate insieme ad un concatenate operator.

Insert into Person 
    (First, Last) 
Values 
    'Joe', 
    concat('O',char(39),'Brien') 
0

utilizzare virgolette doppie attorno ai valori.

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

Si noti che questo non è più SQL standard, anche se so che Informix, per nominare un solo DBMS, consente esso. Dovresti anche indirizzare come inseriresti una stringa come 'Ha detto," Do not! "' Usando virgolette singole e/o doppie virgolette, che possono essere fatte: "Ha detto," Non farlo! " "o" "Ha detto" "Non farlo!" "" ". Quando si aggiunge una nuova risposta a una domanda a lungo termine con risposte accettate, è necessario fornire nuove informazioni complete. L'uso di virgolette è nuovo, ma limitato a pochi DBMS; dovresti preoccuparti di identificare almeno uno di quelli che li accetta. –

Problemi correlati