Chà, đó chỉ là thoát kép, nhưng có nó hoạt động và đây là lý do tại sao:trong MySQL, có một lớp thoát thứ hai liên quan khi bạn sử dụng LIKE
nhà điều hành.
services LIKE '%L\\\\u00e4mm\\\\u00f6n%'
phân tích cú pháp mà chuỗi MySQL theo nghĩa đen cung cấp cho bạn so sánh với truy vấn LIKE %L\\u00e4mm\\u00f6n%
. Vì MySQL xử lý \
trong một truy vấn LIKE dưới dạng một lối thoát, điều đó sẽ thực sự khớp với chuỗi ký tự chứa L\u00e4mm\u00f6n
.
Lý do cho điều này là để bạn có thể so khớp các chuỗi với biểu thức truy vấn có chứa %
theo nghĩa đen hoặc _
tính cách. Ví dụ:nếu tôi muốn tìm kiếm một cột cho chuỗi ký tự 100%
, Tôi có thể so khớp nó với 100\%
(được viết trong một truy vấn dưới dạng '100\\%'
) và đảm bảo rằng tôi thực sự nhận được một trăm phần trăm chứ không phải bất kỳ chuỗi nào bắt đầu bằng một trăm.
Thật không may khi MySQL sử dụng dấu gạch chéo ngược cho cả thoát truy vấn LIKE và thoát theo chuỗi ký tự của nó, đặc biệt là khi bạn có thể đang viết bằng một ngôn ngữ lập trình mã hóa cũng sử dụng chúng, kết thúc bằng mã hóa bộ ba thực tế, trông giống như "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"
- argh!
Thật đáng tiếc khi hành vi này không tuân theo ANSI SQL và sẽ không hoạt động trong bất kỳ cơ sở dữ liệu nào khác. ANSI SQL nói rằng không có ký tự thoát trong các truy vấn LIKE theo mặc định, vì vậy nếu bạn muốn khớp với một %
theo nghĩa đen hoặc _
bạn phải chọn tham gia bằng cách chỉ định một nhân vật thoát của riêng bạn, ví dụ:
something LIKE '100=%' ESCAPE '='
Để tương thích cơ sở dữ liệu chéo, tốt nhất là luôn sử dụng LIKE
... ESCAPE
và chọn một cái gì đó khác hơn là dấu gạch chéo ngược kinh khủng! (Bên cạnh đó - các dấu gạch chéo ngược của MySQL cho việc thoát theo nghĩa đen của chuỗi SQL cũng không tuân theo ANSI! Nhưng bạn có thể tắt hành vi sai đó bằng cài đặt NO_BACKSLASH_ESCAPES sql_mode.)
Có lẽ ý tưởng tốt hơn sẽ là phá vỡ các dịch vụ services
ra bảng thứ hai thay vì dồn chúng vào một cột chuỗi đơn - tức là. đặt lược đồ của bạn ở Dạng chuẩn đầu tiên. Sau đó, bạn có thể tìm kiếm đơn giản các giá trị riêng lẻ thay vì phải thực hiện quá trình so khớp chuỗi con-quét toàn bảng chậm chạp.