¿Cómo escapar del apóstrofe (') en MySql?

147

La documentación de MySQL dice que debería ser \'. Sin embargo, scite y mysql muestran que ''funciona. Lo vi y funciona. ¿Qué tengo que hacer?

user4951
fuente
¿Estás hablando sobre si es correcto ''o no \'?
Raptor
\'es específico de MySQL, mientras que ''es compatible con ANSI SQL, si no me equivoco
apokryfos
Dependiendo de la implementación de SQL; - '' \ '', '\' 'y, a veces,' [']' 'permitirán salir del código. Además de esto, cualquier número de reemplazos de Unicode omitirá esta verificación. Todo el juego aquí está abusando de la calidad del "escape basado" que requiere que el "conteo final" sea par en lugar de impar. Si termina extraño combinando múltiples métodos de escape entre sí, puede vencer el escape e inyectar SQL sin formato. Moraleja de la historia: NUNCA use interpolación de cadenas, SIEMPRE use declaraciones preparadas.
Shayne

Respuestas:

186

La documentación de MySQL que cita en realidad dice un poco más de lo que menciona. También dice

Un " '" dentro de una cadena entre comillas con " '" puede escribirse como " ''".

(Además, se vinculó a la versión MySQL 5.0 de la Tabla 8.1. Secuencias especiales de escape de caracteres , y la versión actual es 5.6, pero la Tabla 8.1 actual . Secuencias especiales de escape de caracteres se parece bastante).

Creo que la nota de Postgres sobre el backslash_quote (string)parámetro es informativa:

Esto controla si una comilla se puede representar \'en un literal de cadena. La forma preferida estándar de SQL para representar una comilla es doblarla ( '') pero PostgreSQL también ha aceptado históricamente \'. Sin embargo, el uso de \'crea riesgos de seguridad ...

Eso me dice que usar un carácter de comillas simples duplicadas es una mejor opción general y a largo plazo que usar una barra invertida para escapar de la comilla simple.

Ahora, si también desea agregar la elección del idioma, la elección de la base de datos SQL y sus peculiaridades no estándar, y la elección del marco de consulta a la ecuación, entonces podría terminar con una opción diferente. No das mucha información sobre tus limitaciones.

Jim DeLaHunt
fuente
42

SQL estándar utiliza comillas duplicadas; MySQL tiene que aceptar eso para cumplir razonablemente.

'He said, "Don''t!"'
Jonathan Leffler
fuente
+1. ¿Dónde dice que debería ser escapado por '' no dev.mysql.com/doc/refman/5.0/en/...
user4951
Dice 'puede' en lugar de 'debería', pero la información está allí (debajo de la tabla): hay varias formas de incluir comillas dentro de una cadena: un " '" dentro de una cadena entre comillas con " '" puede escribirse como " ''" . Un " "" dentro de una cadena entre comillas con " "" puede escribirse como " """. Preceda el carácter de comillas por un carácter de escape ("` `").
Jonathan Leffler
1
Esta es la mejor manera de escapar del apóstrofe duplicándolo.
Alex _TNT
10

Lo que creo que significó user2087510 fue:

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

También he usado esto con éxito.

usuario3169788
fuente
1
Trabajado para mí, mientras que aquellas respuestas más no lo hicieron
Jared
1
¿Por qué \\ 'en lugar de \'?
biniam
@biniam_Ethiopia el segundo \ escapa al primero
Juha Untinen
2
posible problema de seguridad. puede obtener inyección sql si la cadena ya contiene \ ', por lo que inserta un \, que ahora está en la cadena como \\', que terminará la cadena. Use name.replace ("'", "' '") en su lugar
Garr Godfrey
6

solo escribe ''en lugar de 'quiero decir dos veces'

MRRaja
fuente
1
use el apóstrofe dos veces en lugar de uno
MRRaja
5

Aquí hay un ejemplo:

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

Solo use comillas dobles para encerrar la comilla simple.

Si insiste en usar comillas simples (y la necesidad de escapar del personaje):

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

Hay tres formas de las que soy consciente. El primero no es el más bonito y el segundo es la forma común en la mayoría de los lenguajes de programación:

  1. Use otra cita simple: 'I mustn''t sin!'
  2. Utilice el carácter de escape \antes de la comilla simple.' :'I mustn\'t sin!'
  3. Use comillas dobles para encerrar cadenas en lugar de comillas simples: "I mustn't sin!"
Robert Rocha
fuente
Mi preferencia personal sería \'que es utilizada por muchos lenguajes de programación, pero ''es compatible con más dialectos SQL, por lo que usar la opción 1 es mejor para la compatibilidad. Sqlite, por ejemplo, no funciona con escapes de barra invertida.
okdewit
0

Reemplazar la cuerda

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

donde valor es su cadena que se va a almacenar en su base de datos.

Más lejos,

Paquete NPM para esto, puedes echarle un vistazo

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

Ashutosh Jha
fuente
Por favor, no solo publique alguna herramienta o biblioteca como respuesta. Al menos demuestre cómo resuelve el problema en la respuesta misma.
Baum mit Augen
Eso no va a funcionar. Olvidaste escapar de las cosas. reemplazar (/ \ '/ g, "\\\'")
Michael
0

Creo que si tiene algún punto de datos con apóstrofe, puede agregar un apóstrofe antes del apóstrofe

p.ej. 'Este es el lugar de John'

Aquí MYSQL asume dos frases 'Este es el lugar de John'

Puedes poner 'Este es el lugar de John'. Creo que debería funcionar de esa manera.

Priyanka Pandhi
fuente
0

Posiblemente fuera de tema, pero tal vez viniste aquí buscando una manera de desinfectar la entrada de texto desde un formulario HTML, de modo que cuando un usuario ingresa el carácter de apóstrofe, no arroja un error cuando intentas escribir el texto en un SQL basada en tablas en un DB. Hay un par de formas de hacer esto, y es posible que también desee leer sobre la inyección SQL, pero una opción simple en PHP es usar la función htmlspecialchars () que convertirá todos sus apóstrofes en lo 'que posiblemente desee almacenar. de todas formas.

Grindlay
fuente
La codificación no es para almacenar, es para mostrar. Use declaraciones preparadas.
mickmackusa
Estoy de acuerdo en que las declaraciones preparadas son el estándar de oro para la seguridad y la fiabilidad. Estaba resaltando un caso específico en el que es posible que desee almacenar datos de texto como HTML, en cuyo caso mi método es además de usar parámetros enlazados, en lugar de en lugar de. HTML de entrada, HTML de salida.
Grindlay