Tìm mysql trong chuỗi

Trong bài viết này, tôi sẽ đề cập đến vấn đề hướng dẫn tìm kiếm tìm kiếm có dấu trên MySQL bằng cách sử dụng CONVERT(value, BINARY). Do đó search có dấu trên MySQL có gì để tìm hiểu trong bài viết này thì hay xem vấn đề tôi đặt ra ở bên dưới

Vấn đề

Khi tôi làm dự án cho khách hàng, và đương nhiên trang web nào cũng có chức năng cần thiết để tìm kiếm. Với một số trang web như tin tức, thương mại điện tử đôi khi chúng ta không đề cập đến việc tìm kiếm kết quả phải chính xác và cụ thể nhất. Ví dụ. User into trang blog itphutran. com và tìm kiếm với từ khóa “học java” thì kết quả tìm kiếm được hiển thị như sau

Tìm mysql trong chuỗi

Như vậy khi tìm kiếm bên ngoài kết quả tìm kiếm với cụm từ “học java” thì nếu trong bài viết của tôi có những cụm từ như “hoc” , “hóc”,…vv Tóm lại là có từ hoc thì nó sẽ được tìm kiếm . Đơn giản vì chúng ta thường sử dụng câu lệnh SQL như sau

CHỌN * TỪ bảng WHERE cột LIKE ‘%học java%’

Do đó, công việc tìm kiếm sẽ thu được kết quả tương tự chứ không phải chính xác bắt buộc phải có cụm từ “học java”

Nhưng với một số trang web như quản lý tín hiệu duy nhất của một trường đại học, hay quản lý danh sách sinh viên giả tạo thì sẽ tìm kiếm một cách chính xác sinh viên đó chứ không nên tìm kiếm những sinh viên liên quan để nâng cao hiệu quả

Một ví dụ như sau

 

Tìm mysql trong chuỗi

 

Tôi có bảng listv với 2 cột sv_id và tên. Trong trường hợp này, tôi muốn tìm kiếm những sinh viên có tên “Anh”

Cách tìm kiếm thông thường khi không sử dụng  CONVERT(value, BINARY)

CHỌN * TỪ lissv trong đó tên THÍCH “%Anh”

Như vậy kết quả tìm kiếm.  

 

Tìm mysql trong chuỗi

 

Qua đó, chúng tôi thấy rằng những thí sinh có tên như Ánh, Cảnh vì có từ “Anh” nên kết quả cũng được search và hiển thị. Nhưng trường hợp này chúng ta không mong kết quả như trên, chính xác phải là sinh viên có tên “Nguyễn Anh”. Vì vậy, lúc này các bạn sẽ sử dụng cách để chuyển từ chuỗi sang chuỗi nhị phân, mục đích chuyển từ chuỗi sang hệ nhị phân

Ví dụ. Từ Anh chuyển sang hệ nhị phân có dạng như sau

Anh => 01000001 01101110 01101000

Cảnh => 01000011 1111010100011 01101110 01101000

Qua đó khi chuyển về định dạng nhị phân thì công việc tìm kiếm sẽ chính xác

Tìm kiếm khi sử dụng  CONVERT(value, BINARY)

Vì vậy câu lệnh khi chuyển đổi từ chuỗi sang BINARY trong MySQL là

CHUYỂN ĐỔI ('chuỗi', BINARY))

Tương ứng câu hỏi truy vấn tìm kiếm với ví dụ trên

CHỌN * TỪ lissv trong đó tên LIKE CONCAT(‘%’, CONVERT(‘Anh’, BINARY))

Trong đó các bạn lưu ý chúng ta sử dụng hàm CONCAT để nối chuỗi trong MySQL

Kết quả.  

Tìm mysql trong chuỗi

Qua đó , kết quả như mong đợi

#Tổng kết

Một số trường hợp tìm kiếm chúng ta không cần sử dụng cách chuyển đổi từ chuỗi sang BINARY sử dụng CONVERT(value, BINARY) nhưng nếu muốn tìm kiếm một cách chính xác thì bài hướng dẫn trên là một ví dụ cụ thể

Just a little function which mimics the original mysql_real_escape_string but which doesn't need an active mysql connection. Could be implemented as a static function in a database class. Hope it helps someone.

function mysql_escape_mimic($inp) {
    if(is_array($inp))
        return array_map(__METHOD__, $inp);

    if(!empty($inp) && is_string($inp)) {
        return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp);
    }

    return $inp;
}
?>