Come sfuggire all'apostrofo (') in MySql?


147

La documentazione di MySQL dice che dovrebbe essere \'. Tuttavia, sia scite che mysql mostrano che ''funziona. L'ho visto e funziona. Cosa dovrei fare?


Stai parlando se ''o \'è corretto?
Raptor

\'è specifico per MySQL mentre ''è conforme ANSI SQL se non sbaglio
apokryfos

A seconda dell'implementazione di SQL; - '' \ '', '\' ', e talvolta' [']' 'consentirà di uscire dal codice. Inoltre, qualsiasi numero di sostituzioni Unicode ignorerà questo controllo. L'intero gioco qui sta abusando della qualità dell'evasione basata sul fatto che richiede che il conteggio finale sia pari piuttosto che dispari. Se finisce strano mescolando più metodi di escape l'uno nell'altro, puoi sconfiggere l'escaping e iniettare SQL non elaborato. Morale della storia: MAI usare l'interpolazione di stringhe, SEMPRE usare istruzioni preparate.
Shayne,

Risposte:


186

La documentazione di MySQL che citi in realtà dice un po 'di più di quanto menzioni. Dice anche,

Un " '" all'interno di una stringa citata con " '" può essere scritto come " ''".

(Inoltre, sei collegato alla versione MySQL 5.0 della Tabella 8.1. Sequenze speciali di escape dei caratteri e la versione corrente è 5.6 - ma l'attuale Tabella 8.1. Le sequenze speciali di escape dei caratteri sembrano piuttosto simili.)

Penso che la nota di Postgres sul backslash_quote (string)parametro sia informativa:

Questo controlla se un segno di virgoletta può essere rappresentato \'in una stringa letterale. Il modo preferito e standard SQL per rappresentare un segno di virgolette è raddoppiandolo ( ''), ma PostgreSQL ha anche accettato storicamente \'. Tuttavia, l'uso di \'crea rischi per la sicurezza ...

Ciò mi dice che l'uso di un carattere a virgoletta singola raddoppiato è una scelta complessiva a lungo termine migliore rispetto all'utilizzo di una barra rovesciata per sfuggire alla virgoletta singola.

Ora, se si desidera aggiungere all'equazione anche la scelta della lingua, la scelta del database SQL e le sue stranezze non standard e la scelta del framework di query, si potrebbe finire con una scelta diversa. Non fornisci molte informazioni sui tuoi vincoli.


42

SQL standard utilizza virgolette doppie; MySQL deve accettare che sia ragionevolmente conforme.

'He said, "Don''t!"'

+1. Dove dice che dovrebbe essere evitato da '' non dev.mysql.com/doc/refman/5.0/en/…
user4951

Dice 'può' piuttosto che 'dovrebbe', ma l'informazione è lì (sotto la tabella): Esistono diversi modi per includere caratteri di citazione all'interno di una stringa: Un " '" all'interno di una stringa citata con " '" può essere scritto come " ''" . Un " "" all'interno di una stringa citata con " "" può essere scritto come " """. Precede il carattere di citazione da un carattere di escape ("` `").
Jonathan Leffler,

1
Questo è il modo migliore per sfuggire all'apostrofo raddoppiandolo.
Alex _TNT

10

Quello che credo intendesse user2087510 era:

name = 'something'
name = name.replace("'", "\\'")

L'ho usato anche con successo.


1
Ha funzionato per me mentre quelle risposte migliori no
Jared

1
perché \\ 'piuttosto che \'?
Biniam,

@biniam_Ethiopia the second \ escape the first one
Juha Untinen

2
possibile problema di sicurezza. può ottenere l'iniezione sql se la stringa contiene già \ ', quindi inserisci un \, che ora è nella stringa come \\' che terminerà la stringa. Usa name.replace ("'", "' '") invece
Garr Godfrey il

6

basta scrivere ''al posto di 'intendo due volte'


1
usa l'apostrofo due volte al posto di uno
MRRaja

5

Ecco un esempio:

SELECT * FROM pubs WHERE name LIKE "%John's%"

Usa solo virgolette doppie per racchiudere la citazione singola.

Se insisti nell'usare virgolette singole (e la necessità di sfuggire al personaggio):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'

4

Sono tre i modi di cui sono a conoscenza. Il primo non è il più bello e il secondo è il modo comune nella maggior parte dei linguaggi di programmazione:

  1. Usa un'altra singola citazione: 'I mustn''t sin!'
  2. Usa il carattere di escape \prima della virgoletta singola ':'I mustn\'t sin!'
  3. Usa le virgolette doppie per racchiudere la stringa anziché le virgolette singole: "I mustn't sin!"

La mia preferenza personale sarebbe \'come viene utilizzata da così tanti linguaggi di programmazione, ma ''è supportata da più dialetti SQL, quindi l'utilizzo dell'opzione 1 è migliore per la compatibilità. Sqlite, ad esempio, non funziona con le escape backslash.
Okdewit,

0

Sostituisci la stringa

value = value.replace(/'/g, "\\'");

dove valore è la stringa che verrà archiviata nel database.

Ulteriore,

Pacchetto NPM per questo, puoi avere un'occhiata in esso

https://www.npmjs.com/package/mysql-apostrophe


Ti preghiamo di non pubblicare solo alcuni strumenti o librerie come risposta. Almeno dimostrare come risolve il problema nella risposta stessa.
Baum mit Augen

Non funzionerà. Hai dimenticato di sfuggire alle cose. sostituisci (/ \ '/ g, "\\\'")
Michael,

0

Penso che se hai qualche punto dati con l'apostrofo puoi aggiungere un apostrofo prima dell'apostrofo

per esempio. "Questo è l'alloggio di John"

Qui MYSQL assume due frasi "Questo è il posto di John"

Puoi mettere "Questo è il posto di John". Penso che dovrebbe funzionare in questo modo.



0

Forse fuori tema, ma forse sei venuto qui alla ricerca di un modo per disinfettare l'input di testo da un modulo HTML, in modo che quando un utente inserisce il carattere apostrofo, non si genera un errore quando si tenta di scrivere il testo in un SQL tabella basata su un DB. Ci sono un paio di modi per farlo, e potresti voler leggere anche l'iniezione SQL, ma una semplice opzione in PHP è usare la funzione htmlspecialchars () che convertirà tutti i tuoi apostrofi in 'cui è probabilmente quello che vuoi memorizzare Comunque.


La codifica non è per l'archiviazione, è per la visualizzazione. Usa dichiarazioni preparate.
mickmackusa

Concordo sul fatto che le dichiarazioni preparate sono il gold standard per sicurezza e affidabilità. Stavo mettendo in evidenza un caso specifico in cui potresti voler archiviare i dati di testo come HTML, nel qual caso il mio metodo è in aggiunta all'utilizzo di parametri associati, anziché anziché. HTML in entrata, HTML in uscita.
Grindlay
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.