2011-12-27 34 views
17

Có cách nào để làm cho truy vấn tìm kiếm có dấu không nhạy cảm?Truy vấn tìm kiếm không nhạy cảm với giọng trong MySQL

đối chiếu cột và bảng là utf8_polish_ci và tôi không muốn thay đổi chúng.

dụ từ: Toruń

select * from pages where title like '%torun%' 

Nó không tìm thấy "Toruń". Làm thế nào tôi có thể làm điều đó?

+1

http://stackoverflow.com/questions/2302813/normalizing-accented-characters-in-mysql-queries – Sun

+0

@SunWKim Tôi đã thử điều đó trước đây nhưng không hiệu quả đối với tôi. – ocanal

+0

@ocanal bạn có tìm thấy giải pháp mà bạn có thể chia sẻ với chúng tôi không? – zvzej

Trả lời

17

Bạn có thể thay đổi collation trong thời gian chạy trong truy vấn sql,

...where title like '%torun%' collate utf8_general_ci 

nhưng hãy cẩn thận rằng việc thay đổi collation khi đang bay trong thời gian chạy forgoes khả năng mysql sử dụng một chỉ số, vì vậy hiệu suất trên bảng lớn có thể khủng khiếp.

Hoặc, bạn có thể sao chép cột này sang cột khác, chẳng hạn như searchable_title, nhưng thay đổi đối chiếu trên cột đó. Nó thực sự phổ biến để làm loại công cụ này, nơi bạn sao chép dữ liệu nhưng có nó trong một số hình thức hơi khác nhau được tối ưu hóa cho một số khối lượng công việc/mục đích cụ thể. Bạn có thể sử dụng trình kích hoạt như một cách hay để giữ cho các cột trùng lặp được đồng bộ hóa. Phương pháp này có khả năng hoạt động tốt, nếu được lập chỉ mục.

Lưu ý - Đảm bảo rằng db của bạn thực sự có các ký tự đó chứ không phải các thực thể html. Ngoài ra, bộ ký tự của kết nối của bạn cũng quan trọng. Trên giả định nó là thiết lập để utf8, ví dụ, thông qua set names như set names utf8

Nếu không, bạn cần một introducer cho giá trị văn chương

...where title like _utf8'%torun%' collate utf8_general_ci 

và tất nhiên, giá trị trong dấu nháy đơn thực sự phải utf8 được mã hóa, ngay cả khi phần còn lại của truy vấn sql không.

+1

Bạn có bất kỳ ý tưởng nào tại sao nó không hoạt động đối với Ł (đánh bóng L có dấu - giống như trong thành phố Łódź)? '... nơi thành phố như _utf8 '% lodz%' đối chiếu utf8_general_ci' – suz

4

Điều này sẽ không hoạt động trong trường hợp khắc nghiệt, nhưng hãy cố gắng thay đổi cột đối chiếu thành UFT8 utf8_unicode_ci. Sau đó, các ký tự có dấu sẽ bằng với các đối tác không có dấu của chúng.

Các vấn đề liên quan