Tôi có bốn cột chứa tên và muốn tìm kiếm chúng bằng cách sử dụng LIKE
trong môi trường Microsoft SQL Server.
Các biến chứng đi kèm mà tên có thể bao gồm trái và bên phải dấu chú giải đơn / dấu nháy góc cạnh (ví dụ ‘
và ’
, char(145)
và char(146)
tương ứng), mà phải phù hợp với một dấu nháy đơn thẳng (ví dụ '
, char(39)
)
Làm như sau rất chậm:
SELECT person_id
FROM person
WHERE REPLACE(
REPLACE(
person_name,
CHAR(145),
CHAR(39)
),
CHAR(146),
CHAR(39)
) LIKE '{USER_INPUT}'
Như đã giải thích trong câu lệnh thay thế SQL quá chậm trên Stack Overflow, điều này là do việc sử dụng REPLACE
làm cho câu lệnh không thể mở rộng được.
Có cách nào để SQL Server có thể xử lý các tình huống như thế này theo cách tốt hơn không?
Một giải pháp đã được đề xuất là phải có ứng dụng tạo ra một giá trị 'tìm kiếm' mà concatenates tất cả các lĩnh vực ( person_name
, person_surname
, person_nickname
, vv) và người cải đạo những nhân vật có vấn đề tại thời điểm chỉnh sửa. Điều này có thể được lập chỉ mục và tìm kiếm một cách hiệu quả. Lưu trữ dữ liệu này trong một bảng / cột SQL riêng biệt sẽ yêu cầu viết lại ứng dụng ít hơn so với thực hiện một giải pháp NoQuery đầy đủ như Lucene.
Ví dụ trên là một sự đơn giản hóa: truy vấn không được xây dựng theo đúng nghĩa đen như tôi đã giải thích ở trên và chúng tôi thực hiện các biện pháp bảo vệ SQL (và các biện pháp khác).
Câu hỏi là làm thế nào để thay thế các dấu nháy đơn bằng các dấu thẳng trong dữ liệu bảng. Làm rõ:
- Nguồn cung cấp của người dùng
O‘Malley
- điều này phải phù hợp với cảO‘Malley
hoặcO'Malley
- Nguồn cung cấp của người dùng
O'Malley
- điều này phải phù hợp với cảO‘Malley
hoặcO'Malley
Chúng ta cần thay thế dữ liệu SQL, không phải đầu vào của người dùng. Chúng ta có thể chuyển đổi đầu vào của người dùng trên đường đi qua ứng dụng để nếu họ nhập các dấu nháy đơn, chúng ta thay đổi chúng thành các dấu nháy đơn giản trước khi chuyển sang SQL. Đó là dữ liệu trong SQL chúng ta cần chuẩn hóa.
Thật không may, dữ liệu phải ở trong cơ sở dữ liệu dưới dạng khung chính xác, nhưng khi chúng ta thực hiện tìm kiếm, chúng ta cần đối chiếu tất cả chúng với các dấu nháy đơn.