Xử lý lỗi tìm kiếm trong MYSQL

March 22nd, 2008 by ducmanh Leave a reply »

Không biết các bạn đã bao giờ gặp phải vấn đề lỗi tìm kiếm trong MYSQL chưa. Vấn đề thế này :

Ví dụ : Trong cơ sở dữ liệu bạn có các chữ : ” ống dây cáp,cuộc sống,…”.

Khi bạn Search với từ khóa : “ỐNG day cáp” hay cuỘc sỐng thì bạn không nhận được kết quả nào cả.

Qua tìm hiểu mình thấy rằng các phiên bản MYSQL 4.xxx không nhận dạng được một số ký tự unicode chữ hoa hay chữ thường.( Các phiên bản mới hơn thì mình cũng ko biết có bị lỗi vậy ko ).

Để giải quyết vấn đề này mình đã viết ra hai hàm sau mong rằng sẽ có ích cho các bạn

#Function Fillter to Search

function toUpper ($text) {
$lower = array(
‘á’,'à’,'ả’,'ã’,'ạ’,'â’,'ấ’,'ầ’,'ậ’,'ẩ’,'ẫ’,'ă’,'ắ’,'ằ’,'ặ’,'ẵ’,'ẳ’,'ê’,'ế’,'ề’,'ệ’,'ể’,'ễ’,
‘ô’,'ố’,'ồ’,'ộ’,'ổ’,'ỗ’,'ơ’,'ớ’,'ờ’,'ợ’,'ỡ’,'ở’,'ư’,'ứ’,'ừ’,'ự’,'ữ’,'ử’,'ị’,'ì’,'í’,'ĩ’,'ỉ’,
‘ý’,'ỳ’,'ỵ’,'ỷ’,'ỹ’,'ù’,'ú’,'ụ’,'ũ’,'ủ’
);

$upper=array(
‘Á’,'À’,'Ả’,'Ã’,'Ạ’,'Â’,'Ấ’,'Ầ’,'Ậ’,'Ẩ’,'Ẫ’,'Ă’,'Ắ’,'Ằ’,'Ặ’,'Ẵ’,'Ẳ’,'Ê’,'Ế’,'Ề’,'Ệ’,'Ể’,'Ễ’,
‘Ô’,'Ố’,'Ồ’,'Ộ’,'Ổ’,'Ỗ’,'Ơ’,'Ớ’,'Ờ’,'Ợ’,'Ỡ’,'Ở’,'Ư’,'Ứ’,'Ừ’,'Ự’,'Ữ’,'Ử’,'Ị’,'Ì’,'Í’,'Ĩ’,'Ỉ’,
‘Ý’,'Ỳ’,'Ỵ’,'Ỷ’,'Ỹ’,'Ù’,'Ú’,'Ụ’,'Ũ’,'Ủ’
);

$text = str_replace($lower, $upper,$text);
return strToUpper($text);
}

function toLower ($text) {
$lower = array(
‘á’,'à’,'ả’,'ã’,'ạ’,'â’,'ấ’,'ầ’,'ậ’,'ẩ’,'ẫ’,'ă’,'ắ’,'ằ’,'ặ’,'ẵ’,'ẳ’,'ê’,'ế’,'ề’,'ệ’,'ể’,'ễ’,
‘ô’,'ố’,'ồ’,'ộ’,'ổ’,'ỗ’,'ơ’,'ớ’,'ờ’,'ợ’,'ỡ’,'ở’,'ư’,'ứ’,'ừ’,'ự’,'ữ’,'ử’,'ị’,'ì’,'í’,'ĩ’,'ỉ’,
‘ý’,'ỳ’,'ỵ’,'ỷ’,'ỹ’,'ù’,'ú’,'ụ’,'ũ’,'ủ’
);

$upper=array(
‘Á’,'À’,'Ả’,'Ã’,'Ạ’,'Â’,'Ấ’,'Ầ’,'Ậ’,'Ẩ’,'Ẫ’,'Ă’,'Ắ’,'Ằ’,'Ặ’,'Ẵ’,'Ẳ’,'Ê’,'Ế’,'Ề’,'Ệ’,'Ể’,'Ễ’,
‘Ô’,'Ố’,'Ồ’,'Ộ’,'Ổ’,'Ỗ’,'Ơ’,'Ớ’,'Ờ’,'Ợ’,'Ỡ’,'Ở’,'Ư’,'Ứ’,'Ừ’,'Ự’,'Ữ’,'Ử’,'Ị’,'Ì’,'Í’,'Ĩ’,'Ỉ’,
‘Ý’,'Ỳ’,'Ỵ’,'Ỷ’,'Ỹ’,'Ù’,'Ú’,'Ụ’,'Ũ’,'Ủ’
);

$text = str_replace($upper,$lower, $text);
return strToLower($text);
}

Hai hàm ở trên dùng để convert tất cả chữ hoa sang chữ thường hoặc chữ thường sang chữ hoa.

Để giải quyết vấn đề trên mình đã làm như sau:


$key_lower=toLower($_POST["keyword"]);
$key_upper=toUpper($_POST["keyword"]);

khi truy vấn mình chỉ cần so sánh với 2 key trên

$sql=”SELECT * FROM tbl_content WHERE content LIKE ‘%$key_lower%’ OR content LIKE ‘%$key_upper%’”;

Với cách này vấn đề của mình đã được giải quyết.Nếu bạn nào có cách hay hơn thì post lên cho mọi người cùng tham khảo nhé

Nguyễn Đức Mạnh

Advertisement

7 comments

  1. Cuacon says:

    cam on ban rat nhieu, toi dang tim cai nay, no rat can cho toi.

  2. Tăng Đức Nam says:

    Chào Bạn mình cũng đang gặp phải vấn đề về tìm kiếm tiếng việt trong mysql. Đọc topic này của bạn mình thấy là bạn đã xử lý được vấn đề tìm kiếm tiếng việt trong mysql còn 2 hàm bạn viết ở trên dùng để xử lý vấn đề không nhận dạng được chữ hoa và chữ thường? Nếu bạn đã xử lý được vấn đề tìm kiếm tiếng việt bạn có thể mail và hướng dẫn cho mình được không.
    Mình đã copy 2 hàm của bạn viết về và chạy thử nhưng nó vấn không tìm thấy.
    Mình cảm ơn bạn rất nhiều!
    Thân!
    Tăng Đức Nam

  3. Nếu chữ nào mà search có phân biệt chữ hoa chữ thường thì bạn thêm vào trong các mảng thay thế trên.Ví dụ chữ Đ –> chữ đ, chữ Ô –> ô…Mình đảm bảo là Search sẽ OK. Các chữ mình thống kế ở trên hình như còn thiếu 1 số từ thì phải.

    Chú ý : khi so sánh trong tìm kiếm phải so sánh 3 lần : LIKE %$keyword% OR LIKE %$keyword_lower% OR LIKE %$keyword_upper%

  4. pn2design says:

    Cảm ơn nhé, xin phép được copy code này qua Blog của mình.

  5. PN2design says:

    Nếu trong Database có dữ liệu

    “NẾu chữ nÀo mà search có phÂn biệt chŨ hoa cHữ thưỜng thì bạn thêm vào trong các mẢng thay thế trên”

    thì tìm thế nào hả bạn? :D
    Comment của mình tại bài viết này đã bị bạn xóa đi thật buồn. Nếu bạn muốn tìm tốt hơn mời qua Blog của mình nhé.

  6. Cường says:

    Search kiểu này dễ ra trùng kết quả lắm, sao bạn không tìm thêm kiểu cắt từng từ ra để tìm kiếm, ví dụ cụm từ “tôi là” thì sẽ tìm theo 4 kiểu:

    1.Tìm cụm từ “TÔI LÀ”
    2.Tìm từng từ: “tôi” và “là”
    3.Tìm từng từ: “TÔI” và “LÀ”
    4.Tìm cụm từ: “tôi là”

    sau đó sẽ nhóm chung thành một kết quả và cho hiển thị ra ngoài.

Leave a Reply