Bạn có thể bắt đầu bằng cách sử dụng SOUNDEX()
, điều này có thể sẽ làm được những gì bạn cần (tôi hình dung một hộp gợi ý tự động gồm các lựa chọn thay thế đã có sẵn cho những gì người dùng đang nhập).
Hạn chế của SOUNDEX()
là:
- không có khả năng phân biệt các chuỗi dài hơn. Chỉ một số ký tự đầu tiên được tính đến, các chuỗi dài hơn phân kỳ ở cuối sẽ tạo ra cùng một giá trị SOUNDEX
- thực tế là chữ cái đầu tiên phải giống nhau, nếu không bạn sẽ không dễ dàng tìm thấy sự trùng khớp. SQL Server có hàm DIFFERENCE () để cho bạn biết hai giá trị SOUNDEX cách nhau bao nhiêu, nhưng tôi nghĩ MySQL không có gì thuộc loại đó được tích hợp sẵn.
- đối với MySQL, ít nhất là theo the tài liệu , SOUNDEX bị hỏng đối với đầu vào unicode
Ví dụ:
SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')
/* all of these return 'M262' */
Đối với các nhu cầu nâng cao hơn, tôi nghĩ bạn cần xem xét khoảng cách Levenshtein (còn được gọi là "chỉnh sửa khoảng cách") của hai chuỗi và hoạt động với một ngưỡng. Đây là giải pháp phức tạp hơn (=chậm hơn), nhưng nó cho phép linh hoạt hơn.
Hạn chế chính là, bạn cần cả hai chuỗi để tính toán khoảng cách giữa chúng. Với SOUNDEX, bạn có thể lưu trữ SOUNDEX được tính toán trước trong bảng của mình và so sánh / sắp xếp / nhóm / bộ lọc trên đó. Với khoảng cách Levenshtein, bạn có thể thấy rằng sự khác biệt giữa "Microsoft" và "Nzcrosoft" chỉ là 2, nhưng sẽ mất nhiều thời gian hơn để đi đến kết quả đó.
Trong mọi trường hợp, bạn có thể tìm thấy một hàm khoảng cách Levenshtein ví dụ cho MySQL tại codejanitor.com:Khoảng cách Levenshtein dưới dạng một hàm được lưu trữ trong MySQL (ngày 10 tháng 2 năm 2007) .