2010-10-14 15 views
5

Zauważyłem, że kiedy używam numeru PreparedStatement, nie wydaje się, że wymyka się niektórym znakom wieloznacznym, takim jak "%" lub "_". Wiem, że można je uciec w MySql przy użyciu odwrotnego ukośnika. Zastanawiam się, jakie znaki uciekną z tego PreparedStatement?Jakie znaki uciekną PreparedStatement?

Odpowiedz

6

PreparedStatement niczego nie wymyka się - opiera się na obsłudze baz danych dla skompilowanych instrukcji.

Oznacza to, że PreparedStatement nie zastępuje ? s dla wartości parametrów w celu utworzenia dosłownego ciągu zapytania. Zamiast tego wysyła ciąg zapytania z symbolami zastępczymi do bazy danych i korzysta z obsługi bazy danych w celu powiązania parametrów zapytania (jednak może to zależeć od implementacji sterownika JDBC).

+1

Interesujące, jak wygląda to wsparcie dla MySql? – stevebot

+0

MySql obsługuje przygotowane instrukcje w taki sam sposób po stronie serwera. Wygląd tego kodu zależy od używanego sterownika. –

+0

Wierzę, że wiele sterowników rzeczywiście wstawia tekst argumentu z argumentem escape do tekstu SQL. –

0

W moim teście wyklucza pojedyncze cudzysłowy, \r, \t, \n i tak dalej. Działa całkiem nieźle:

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

Może to być specyficzne dla sterownika/bazy danych. Jak wspomniano, większość nie odbiera automatycznie wejścia. – Leigh

Powiązane problemy