2008-11-29 75 views
8

Dưới đây là câu lệnh SQL hiện tại của tôi:ký tự đại diện trong Java PreparedStatements

SEARCH_ALBUMS_SQL = "SELECT * FROM albums WHERE title LIKE ? OR artist LIKE ?;"; 

Nó trở về chính xác phù hợp với album hoặc nghệ sĩ tên, nhưng không phải bất cứ điều gì khác. Tôi không thể sử dụng dấu '%' trong câu lệnh hoặc tôi gặp lỗi.

Làm cách nào để thêm ký tự đại diện vào câu lệnh đã chuẩn bị?

(Tôi đang sử dụng Java5 và MySQL)

Cảm ơn!

+0

Đây là [phiên bản tốt hơn của cùng một câu hỏi] (http://stackoverflow.com/q/8247970/154527). –

Trả lời

18

Bạn đặt% trong biến bị ràng buộc. Vì vậy, bạn làm

stmt.setString(1, "%" + likeSanitize(title) + "%"); 
    stmt.setString(2, "%" + likeSanitize(artist) + "%"); 

Bạn nên thêm ESCAPE '!' để cho phép bạn thoát khỏi các ký tự đặc biệt quan trọng đối với LIKE trong đầu vào của bạn.

Trước khi sử dụng tiêu đề hoặc nghệ sĩ bạn nên khử trùng chúng (như trình bày ở trên) bằng cách thoát ký tự đặc biệt (, %, _[!) Với một phương pháp như thế này:

public static String likeSanitize(String input) { 
    return input 
     .replace("!", "!!") 
     .replace("%", "!%") 
     .replace("_", "!_") 
     .replace("[", "!["); 
} 
+1

Vậy, nếu biến bị ràng buộc thực sự có ký tự '%' trong nó thì sao? –

+0

@Eric - Sau đó, bạn không cần phải thêm nó. Không có gì huyền diệu về việc làm nó trong setString hơn là bất cứ nơi nào khác. –

+4

Nếu biến bị ràng buộc của bạn có chữ '%', bạn nên thoát nó thành '\%'. Xem phương thức Java java.lang.String.replace(). –

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