Domanda

Questa domanda ha già una risposta qui:

Ho un database con nomi come John Doe ecc.Sfortunatamente alcuni di questi nomi contengono citazioni come Keiran O'Keefe.Ora quando provo a cercare nomi come segue:

SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe' 

Ottengo (comprensibilmente) un errore.

Come posso evitare che si verifichi questo errore.Sto usando Oracle e PLSQL.

È stato utile?

Soluzione

Il carattere di escape è ', quindi dovresti sostituire la virgoletta con due virgolette.

Per esempio,

SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'

diventa

SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'

Detto questo, probabilmente non è corretto farlo da soli.La tua lingua potrebbe avere una funzione per eseguire l'escape delle stringhe da utilizzare in SQL, ma un'opzione ancora migliore è utilizzare i parametri.Di solito funziona come segue.

Il tuo comando SQL sarebbe:

SELECT * FROM PEOPLE WHERE SURNAME=?

Quindi, quando lo esegui, passi "O'Keefe" come parametro.

Poiché l'SQL viene analizzato prima che il valore del parametro venga impostato, non c'è modo per il valore del parametro di alterare la struttura dell'SQL (ed è anche un po' più veloce se si desidera eseguire la stessa istruzione più volte con parametri diversi).

Dovrei anche sottolineare che, mentre il tuo esempio causa solo un errore, ti esponi a molti altri problemi non eseguendo l'escape delle stringhe in modo appropriato.Vedere http://en.wikipedia.org/wiki/SQL_injection per un buon punto di partenza o il classico successivo fumetto xkcd.

alt text

Altri suggerimenti

La soluzione Oracle 10 lo è

SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'

Le query parametrizzate sono tue amiche, come suggerito da Matt.

Command = SELECT * FROM PEOPLE WHERE SURNAME=?

Ti proteggeranno dai mal di testa coinvolti

  • Stringhe con virgolette
  • Interrogazione utilizzando le date
  • SQL Injection

L'uso di SQL parametrizzato presenta altri vantaggi, riduce il sovraccarico della CPU (così come altre risorse) in Oracle riducendo la quantità di lavoro richiesta da Oracle per analizzare l'istruzione.Se non utilizzi parametri (li chiamiamo variabili di collegamento in Oracle) allora "select * from foo where bar='cat'" e "select * from foo where bar='dog'" vengono trattati come istruzioni separate, dove as " select * from foo where bar=:b1" è la stessa istruzione, il che significa che cose come la sintassi, la validità degli oggetti a cui si fa riferimento ecc... non necessitano di essere ricontrollati.Ci sono problemi occasionali che sorgono quando si utilizzano variabili di associazione che di solito si manifestano nel non ottenere il piano di esecuzione SQL più efficiente, ma esistono soluzioni alternative per questo e questi problemi dipendono in realtà dai predicati che stai utilizzando, dall'indicizzazione e dall'inclinazione dei dati.

Il filtraggio dell'input viene solitamente eseguito a livello di lingua anziché a livello di database.
php e .NET hanno entrambi le rispettive librerie per l'escape delle istruzioni SQL.Controlla la tua lingua, guarda cosa è disponibile.
Se i tuoi dati sono affidabili, puoi semplicemente sostituire una stringa per aggiungere un altro " davanti al " per evitarlo.Di solito questo è sufficiente se non ci sono rischi che l'input sia dannoso.

Suppongo che una buona domanda sia: che lingua stai usando?
In PHP faresti:SELEZIONA * DA PERSONE DOVE COGNOME='mysql_escape_string(O'Keefe)'
Ma poiché non hai specificato la lingua, ti suggerirò di esaminare una funzione di stringa di escape mysql o altro nella tua lingua.

Per gestire le virgolette se utilizzi Zend Framework ecco il codice

$db = Zend_Db_Table_Abstract::getDefaultAdapter();

$db->quoteInto('your_query_here = ?','your_value_here');

Per esempio ;

//SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe' will become
SELECT * FROM PEOPLE WHERE SURNAME='\'O\'Keefe\''

Trovato sotto i 30 anni su Google...

Domande frequenti su Oracle SQL

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top