2010-10-14 5 views
5

J'ai remarqué que lorsque j'utilise un PreparedStatement, il ne semble pas échapper à certains caractères génériques comme '%' ou '_'. Je sais que ceux-ci peuvent être échappés dans MySql en utilisant un backslash. Cela m'a fait me demander, quels personnages vont échapper à PreparedStatement?Quels personnages seront PreparedStatement échapper?

Répondre

6

PreparedStatement n'échappe à rien - il repose sur la prise en charge de la base de données pour les instructions précompilées.

Cela signifie que PreparedStatement ne remplace jamais ? s pour les valeurs de paramètre afin de former une chaîne de requête littérale. Au lieu de cela, il envoie une chaîne de requête avec des espaces réservés à la base de données et utilise le support de base de données pour lier les paramètres de requête (cependant, cela peut dépendre de l'implémentation du pilote JDBC).

+1

Intéressant, à quoi ressemble ce support pour MySql? – stevebot

+0

MySql supporte les instructions préparées de la même manière côté serveur. L'apparence de votre code dépend du pilote que vous utilisez. –

+0

Je crois que de nombreux pilotes insèrent effectivement du texte d'argument échappé dans le texte SQL. –

0

Dans mon test, il échappe les guillemets simples, \r, \t, \n et ainsi de suite. Cela fonctionne plutôt 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

Cela peut être spécifique à votre pilote/db. Comme mentionné plus haut, la plupart n'échappent pas automatiquement à l'entrée. – Leigh

Questions connexes