una simples simple sencilla reemplazar insertar dobles concatenar como comillas comilla buscar sql oracle

simples - ¿Cómo trato las comillas? En SQL



reemplazar comillas dobles en sql (8)

El filtrado de entrada generalmente se realiza en el nivel de idioma en lugar de las capas de la base de datos.
php y .NET tienen sus respectivas bibliotecas para escapar de las sentencias SQL. Verifique su idioma, vea lo que está disponible.
Si sus datos son confiables, entonces puede hacer un reemplazo de cadena para agregar otro ''delante de'' para escapar. Por lo general, eso es suficiente si no hay riesgos de que la entrada sea maliciosa.

Esta pregunta ya tiene una respuesta aquí:

Tengo una base de datos con nombres como John Doe, etc. Lamentablemente, algunos de estos nombres contienen citas como Keiran O''Keefe. Ahora cuando intento buscar nombres como los siguientes:

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

Yo (comprensiblemente) recibo un error.

¿Cómo evito que ocurra este error? Estoy usando Oracle y PLSQL.


Las consultas parametrizadas son su amigo, como sugiere Matt.

Command = SELECT * FROM PEOPLE WHERE SURNAME=?

Lo protegerán de los dolores de cabeza involucrados con

  • Cadenas con comillas
  • Consultar usando fechas
  • Inyección SQL


Supongo que una buena pregunta es qué idioma estás usando?
En PHP, harías: SELECT * FROM PEOPLE WHERE SURNAME = ''mysql_escape_string (O''Keefe)''
Pero como no especificó el idioma, le sugiero que busque en una función de cadena de escape mysql o de otro modo en su idioma.


El uso de SQL parametrizado tiene otros beneficios, reduce la sobrecarga de la CPU (así como otros recursos) en Oracle al reducir la cantidad de trabajo que Oracle requiere para analizar la declaración. Si no usa parámetros (los llamamos variables de enlace en Oracle), entonces "select * from foo where bar = ''cat''" y "select * from foo donde bar = ''dog''" se tratan como declaraciones separadas, donde como " select * from foo donde bar =: b1 "es la misma instrucción, lo que significa cosas como sintaxis, validez de objetos a los que se hace referencia, etc. ... no es necesario volver a verificarlos. Hay problemas ocasionales que surgen cuando se utilizan variables de vinculación que generalmente se manifiestan al no obtener el plan de ejecución de SQL más eficiente, pero existen soluciones para esto y estos problemas realmente dependen de los predicados que está utilizando, indexación y sesgo de datos.


La solución Oracle 10 es

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


Para tratar citas si está usando Zend Framework aquí está el código

$db = Zend_Db_Table_Abstract::getDefaultAdapter();

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

por ejemplo ;

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


El carácter de escape es '', por lo que necesitarás reemplazar la cita con dos comillas.

Por ejemplo,

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

se convierte

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

Dicho esto, probablemente sea incorrecto hacerlo tú mismo. Su lenguaje puede tener una función para escapar cadenas para usar en SQL, pero una opción aún mejor es usar parámetros. Por lo general, esto funciona de la siguiente manera.

Su comando SQL sería:

SELECT * FROM PEOPLE WHERE SURNAME=?

Luego, cuando lo ejecutas, pasas "O''Keefe" como parámetro.

Debido a que el SQL se analiza antes de establecer el valor del parámetro, no hay forma de que el valor del parámetro altere la estructura del SQL (y es incluso un poco más rápido si desea ejecutar el mismo enunciado varias veces con diferentes parámetros).

También debo señalar que, si bien su ejemplo solo causa un error, usted se abre a muchos otros problemas al no escapar de las cadenas de manera apropiada. Consulte http://en.wikipedia.org/wiki/SQL_injection para conocer un buen punto de partida o el siguiente comic xkcd clásico.