2010-10-14 15 views
5

Me di cuenta de que cuando uso un PreparedStatement no parece escapar de ciertos caracteres comodín como '%' o '_'. Sé que se pueden escapar en MySql usando una barra invertida. Esto me hizo preguntarme, ¿a qué personajes escapará un PreparedStatement?¿Qué caracteres escaparán PreparedStatement?

Respuesta

6

PreparedStatement no escapa nada - se basa en el soporte de base de datos para declaraciones precompiladas.

Es decir, PreparedStatement nunca sustituye ? s por valores de parámetros para formar una cadena de consulta literal. En cambio, envía una cadena de consulta con marcadores de posición a la base de datos y utiliza el soporte de la base de datos para vincular los parámetros de consulta (sin embargo, puede depender de la implementación del controlador JDBC).

+1

Interesante, ¿cómo se ve ese soporte para MySql? – stevebot

+0

MySql admite declaraciones preparadas de la misma manera en el lado del servidor. La forma en que se ve en su código depende del controlador que está utilizando. –

+0

Creo que muchos controladores realmente insertan texto de argumento escapado en el texto SQL. –

0

En mi prueba, se escapa entre comillas simples, \r, \t, \n y así sucesivamente. Funciona muy bien:

String sql = "INSERT INTO test(title) VALUES(?)"; 
PreparedStatement stmt = con.prepareStatement(sql); 
String title = "I'm a \"student\" in a \t (university) \r\n"; 
stmt.setString(1, title); 
stmt.executeUpdate(); 
+0

Eso puede ser específico para su controlador/db. Como ha mencionado axtavt, la mayoría no escapa automáticamente a la entrada. – Leigh

Cuestiones relacionadas