Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Bảo mật cho câu lệnh SQL đã chuẩn bị với REGEX trong truy vấn

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. làm thế nào để chèn các giá trị bằng dấu phẩy? trong câu lệnh switch

  2. Chèn phần đầu của trường mysql INT bằng các số 0

  3. Có thể coi dấu gạch ngang và dấu cách giống nhau trong SQL không?

  4. Làm cách nào để khóa hàng InnoDB chưa tồn tại?

  5. Làm thế nào để bạn biết khi nào bạn cần các bảng riêng biệt?