2010-10-14 33 views
5

Tôi nhận thấy rằng khi tôi sử dụng PreparedStatement, dường như không có các ký tự đại diện nào đó như '%' hoặc '_'. Tôi biết chúng có thể được thoát trong MySql bằng cách sử dụng dấu gạch chéo ngược. Điều này làm tôi băn khoăn, những nhân vật nào sẽ thoát ra khỏi một số? PreparedStatement?Nhân vật nào sẽ PreparedStatement thoát?

Trả lời

6

PreparedStatement không thoát khỏi bất kỳ thứ gì - nó dựa vào hỗ trợ cơ sở dữ liệu cho các câu lệnh được biên dịch trước.

Tức là, PreparedStatement không bao giờ thay thế ? s cho giá trị tham số để tạo thành chuỗi truy vấn bằng chữ. Thay vào đó, nó sẽ gửi một chuỗi truy vấn với các phần giữ chỗ cho cơ sở dữ liệu và sử dụng hỗ trợ cơ sở dữ liệu để ràng buộc các tham số truy vấn (tuy nhiên, nó có thể phụ thuộc vào việc thực thi trình điều khiển JDBC).

+1

Thú vị, hỗ trợ đó trông như thế nào đối với MySql? – stevebot

+0

MySql hỗ trợ các câu lệnh chuẩn bị theo cách tương tự ở phía máy chủ. Làm thế nào nó trông trong mã của bạn phụ thuộc vào trình điều khiển bạn đang sử dụng. –

+0

Tôi tin rằng nhiều trình điều khiển thực sự chèn văn bản đối số thoát vào văn bản SQL. –

0

Trong thử nghiệm của mình, nó sẽ thoát khỏi các dấu ngoặc đơn, \r, \t, \n v.v. Nó hoạt động khá tốt đẹp:

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

Điều đó có thể dành riêng cho trình điều khiển/db của bạn. Như axtavt đã đề cập, hầu hết không tự động thoát khỏi đầu vào. – Leigh

Các vấn đề liên quan