Phần giữ chỗ không thể được trích dẫn. Đơn giản vậy thôi:
SELECT ... WHERE foo = ?
SELECT ... WHERE foo = '?'
Cái đầu tiên là một trình giữ chỗ và hoạt động như mong đợi. Cái còn lại đang kiểm tra sự bình đẳng với ký tự "dấu hỏi". Nó không còn là một trình giữ chỗ nữa.
Và sau đó là vấn đề của ?
cũng là một siêu ký tự regex. Nếu phần giữ chỗ CÓ THỂ được trích dẫn, thì được đưa ra
SELECT ... WHERE foo REGEXP '^.?'
đó sẽ là ?
là trình giữ chỗ truy vấn hay là toán tử dải ô regex "zero-or-one"?
Nếu bạn muốn sử dụng trình giữ chỗ trong regexes, bạn phải "xây dựng" mẫu regex
SELECT ... WHERE foo REGEXP concat('^.', ?)
Chính xác giống như cách bạn phải tạo LIKE
mẫu:
SELECT ... WHERE foo LIKE '%?%' // wrong
SELECT ... WHERE foo LIKE concat('%', ?, '%') // right